Java8新特性之Stream详解二

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/super_YC/article/details/81774244

       最近在公司的项目中常用Stream结合Lambda表达式来操作集合,使得项目整体代码简洁和整齐;并且上一章也讲了一些关于Stream的常用操作,比如:map()、filter()、concat()、reduce()、max()、min()、distinct()等常用操作。这篇我就分享一下Stream中List、Set、Map之间的转换操作:

准备工作:新建一个Course类,包含name、credit两个属性,并重写hashCode()、equals()方法:

class Course {
    private String name;

    private Integer credit;

    public Course(String name, Integer credit) {
        this.name = name;
        this.credit = credit;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getCredit() {
        return credit;
    }

    public void setCredit(Integer credit) {
        this.credit = credit;
    }

    @Override
    public int hashCode() {
        return name.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        Course stu = null;
        if (obj != null && obj instanceof Course) {
            stu = (Course) obj;
            if (this.name.equals(stu.getName()) && this.credit.equals(stu.getCredit())) {
                return true;
            }
        }
        return false;
    }
}

一、Stream将List转换为Map集合

/**
 * Stream将List转换为Map集合
 */
@Test
public void listToMap() {
    List<Course> stuList = Arrays.asList(
        new Course("Android", 10),
        new Course("Java", 8),
        new Course("Structure", 13),
        new Course("IOS", 12),
        new Course("Guava", 16),
        new Course("OS", 6));

    Map<String, Integer> nameAgeMap = stuList.stream().
        collect(Collectors.toMap(Course::getName, Course::getCredit));
    nameAgeMap.entrySet().stream().forEach(x -> System.out.println(x.getKey() + ", " + x.getValue()));

    //Function.identity()指代本身,相当于 x -> x
    Map<String, Course> nameStuMap = stuList.stream().
        collect(Collectors.toMap(Course::getName, Function.identity()));
    nameStuMap.entrySet().stream().forEach(x -> System.out.println(x.getKey() + "," + x.getValue().getCredit()));
}

执行结果展示:(两次结果展示一致)

Guava, 16
Java, 8
OS, 6
IOS, 12
Structure, 13
Android, 10

注意:collect(Collectors.toMap(Course::getName,Function.identity())) 得到的是<name,course>Map集合。

查看Function.identity()底层实现原理:t -> t 返回对象本身

static <T> Function<T, T> identity() {
    return t -> t;
}

二、Stream将List转换为Set集合

    @Test
    public void listToSet() {
        List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5, 1, 2, 3, 4, 5);
        Set<Integer> integerSet = integerList.stream().
                collect(Collectors.toSet());
        integerSet.stream().forEach(System.out::print);
        System.out.println("");

        List<Course> courseList = Arrays.asList(
                new Course("Android", 10),
                new Course("Java", 8),
                new Course("Android", 10),
                new Course("IOS", 12),
                new Course("Guava", 16),
                new Course("Android", 6));
        //排序并去重
        List<Course> courList = courseList.stream().
                sorted(Comparator.comparing(Course::getName)).
                distinct().
                collect(Collectors.toList());
        courList.stream().forEach(c -> System.out.println(c.getName() + "," + c.getCredit()));

        //只去重Set
        Set<Course> courSet = courseList.stream().
                sorted(Comparator.comparing(Course::getName)).
                collect(Collectors.toSet());
        courSet.stream().forEach(c -> System.out.println(c.getName() + "," + c.getCredit()));
    }

结果展示:

12345
Android,10
Android,6
Guava,16
IOS,12
Java,8
Guava,16
Java,8
IOS,12
Android,10
Android,6

注意:对象去重需要重写类的hashCode()、equals()方法,给出去重排序、去重的List转换为Set集合。

Stream操作集合的功能十分强大,结合Lambda表达式使得代码简洁大方、便捷,还有很多StreamAPI需要讨论,后续待学希望一起讨论进步......

猜你喜欢

转载自blog.csdn.net/super_YC/article/details/81774244