JDK8新特性之Stream流

简介: JDK8新特性之Stream流-Stream结果收集案例实操

一.JDK8新特性之Stream流-Stream结果收集以及案例实操

image.png

二.Stream结果收集(collect函数)-实例实操

2.1 结果收集到集合中

    /**
     * Stream将结果收集到集合中以及具体的实现 collect
     */
    @Test
    public void test01(){
   
   
        // 收集到List中   接口
        List<Integer> list = Stream.of(1, 2, 3,4)
                .collect(Collectors.toList());
        System.out.println(list);
        // 收集到 Set集合中  接口
        Set<Integer> set = Stream.of(1, 2, 3,4)
                .collect(Collectors.toSet());
        System.out.println(set);

        // 如果需要获取的类型为具体的实现,ArrayList HashSet
        ArrayList<Integer> list1 = Stream.of(1, 2, 3,4)
                //.collect(Collectors.toCollection(() -> new ArrayList<>()));
                .collect(Collectors.toCollection(ArrayList::new));
        System.out.println(list1);
        //如果需要获取的类型为具体的实现,HashSet
        HashSet<Integer> set1 = Stream.of(1, 2, 3,4)
                .collect(Collectors.toCollection(HashSet::new));
        System.out.println(set1);
    }

2.2 结果收集到数组中

Stream中提供了toArray方法来将结果放到一个数组中,返回值类型是Object[],如果我们要指定返回的类型,那么可以使用另一个重载的toArray(IntFunction f)方法

/**
     * Stream结果收集到数组中
     */
    @Test
    public void test02(){
   
   
        // 返回的数组中的元素是 Object类型
        Object[] objects = Stream.of("s1", "s2", "s3").toArray(); 
        System.out.println(Arrays.toString(objects));
        // 如果我们需要指定返回的数组中的元素类型
        // 需要我们在toArray()方法中传入数组类型
        String[] strings = Stream.of("s1", "s2", "s3")
                .toArray(String[]::new);
        System.out.println(Arrays.toString(strings));
    }

2.3 对流中的数据做聚合计算

​ 当我们使用Stream流处理数据后,可以像数据库的聚合函数一样对某个字段进行操作,比如获得最大值,最小值,求和,平均值,统计数量。

/**
     * Stream流中数据的聚合计算(最大值、最小值、求和、求平均值、满足条件的结果个数)
     */
    @Test
    public void test03(){
   
   
        // 获取员工薪资的最大值
        Optional<Person> maxSalary = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.maxBy((p1, p2) -> p1.getSalary() - p2.getSalary()));
        System.out.println("最多薪资:" + maxSalary.get());
        // 获取员工薪资的最小值
        Optional<Person> minSalary = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.minBy((p1, p2) -> p1.getSalary() - p2.getSalary()));
        System.out.println("最少薪资:" + minSalary.get());
        // 求所有人员工薪资之和
        Integer sumSalary = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.summingInt(Person::getSalary));
        System.out.println("薪资总和:" + sumSalary);
        // 员工薪资的平均值
        Double avgSalary = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.averagingInt(Person::getSalary));
        System.out.println("薪资的平均值:" + avgSalary);
        // 员工薪资统计数量
        Long count = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).filter(p->p.getSalary() > 4000)
                .collect(Collectors.counting());
        System.out.println("满足条件的记录数:" + count);
    }

2.4 对流中数据做分组操作

当我们使用Stream流处理数据后,可以根据某个属性将数据分组

/**
     * 分组计算:按照我们是收入进行分组,分组的高收入组和低收入组
     */
    @Test
    public void test04(){
   
   
        Map<String, List<Person>> map = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.groupingBy(p -> p.getSalary() >= 4000 ? "高收入" : "低收入"));
        map.forEach((k,v)-> System.out.println("k=" + k +"\t"+ "v=" + v));
    }

多级分组: 先根据name分组然后根据年龄分组

/**
     * 分组计算--多级分组(先按照姓名分组,然后再按照年龄分组)
     */
    @Test
    public void test05(){
   
   
        Map<String,Map<Object,List<Person>>> map =  Stream.of(
                new Person("张三", 18, 175)
                , new Person("李四", 22, 177)
                , new Person("张三", 14, 165)
                , new Person("李四", 15, 166)
                , new Person("张三", 19, 182)
        ).collect(Collectors.groupingBy(
                Person::getName
                ,Collectors.groupingBy(p->p.getAge()>=18?"成年":"未成年"
                )
        ));
        map.forEach((k,v)->{
   
   
            System.out.println(k);
            v.forEach((k1,v1)->{
   
   
                System.out.println("\t"+k1 + "=" + v1);
            });
        });
    }

2.5 对流中的数据做分区操作

Collectors.partitioningBy会根据值是否为true,把集合中的数据分割为两个列表,一个true列表,一个false列表

/**
     * 分区操作
     */
    @Test
    public void test06(){
   
   
        Map<Boolean, List<Person>> map = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.partitioningBy(p -> p.getSalary() > 6000));
        map.forEach((k,v)-> System.out.println(k+"\t" + v));
    }

2.6 对流中的数据做拼接

Collectors.joining会根据指定的连接符,将所有的元素连接成一个字符串

/**
     * 对流中的数据做拼接操作(对应着三种重载方法)
     */
    @Test
    public void test07(){
   
   
        // 第一种拼接:直接拼接
        String s1 = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).map(Person::getName)
                .collect(Collectors.joining());
        System.out.println(s1);
        // 第二种拼接:每个拼接中加"_"来进行连接
        String s2 = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).map(Person::getName)
                .collect(Collectors.joining("_"));
        System.out.println(s2);
        // 第三种拼接:前后拼接加上"_",拼接的开始加上"--->",结束加上"<---"
        String s3 = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).map(Person::getName)
                .collect(Collectors.joining("_", "--->", "<---"));
        System.out.println(s3);
    }
相关文章
|
27天前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
35 3
|
13天前
|
存储 安全 Java
JDK1.8 新的特性
JDK1.8 新的特性
15 0
|
1月前
|
编解码 安全 Java
jdk8新特性-接口和日期处理
jdk8新特性-接口和日期处理
|
2月前
|
API
JDK8的stream有求和方法吗?
【8月更文挑战第20天】JDK8的stream有求和方法吗?
73 3
|
2月前
|
Java API
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
|
2月前
|
Java API Apache
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
|
2月前
|
Oracle Java 关系型数据库
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
|
2月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
2月前
|
Java API 开发者
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
|
1月前
|
Java 编译器 API
JDK8新特性--lambda表达式
JDK8的Lambda表达式是Java语言的一大进步。它为Java程序提供了更多的编程方式,让代码更加简洁,也让函数式编程的概念在Java中得到了体现。Lambda表达式与Java 8的其他新特性,如Stream API、新的日期时间API一起,极大地提高了Java编程的效率和乐趣。随着时间的流逝,Java开发者对这些特性的理解和应用将会越来越深入,进一步推动Java语言和应用程序的发展。
11 0