• Java8新特性-Stream对集合进行操作的常用API


    场景

    Java 8扩展了集合类,可以通过 Collection.stream()或者 Collection.parallelStream()来创建一个Stream。

    利用Stream,在对集合比如list进行处理时就不用再进行繁琐的循环遍历操作了。

    比如:

    遍历一个对象list并输出每个的年龄属性

    userList.stream().filter(user -> user.getAge() > 40).forEach(item -> System.out.println(item.getAge()));

    注:

    博客:
    霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    一、Stream的创建

    有3种方法,示例代码如下

    1.         //1、通过java.util.Collection.stream()方法用集合创建流
    2.         List<String> list = Arrays.asList("zhansan","lisi","wangwu");
    3.         Stream<String> stream = list.stream();
    4.         stream.forEach(System.out::println);
    5.         //2、通过java.util.Arrays.stream(T[]array)方法用数组创建流
    6.         String[] array = {"zhansan","lisi","wangwu"};
    7.         Stream<String> stream2 = Arrays.stream(array);
    8.         stream2.forEach(System.out::println);
    9.         //3、使用Stream的静态方法:of() iterate() generate()
    10.         Stream<Integer> stream3 = Stream.of(1,2,3);
    11.         stream3.forEach(System.out::println);
    12.         Stream<Integer> stream4 = Stream.iterate(0,(x->x+3)).limit(4);
    13.         stream4.forEach(System.out::println);
    14.         //双冒号运算操作符是类方法的句柄,lambda表达式的一种简写。双冒号(::)运算符在Java 8中被用作方法引用(method reference)
    15.         //这种[方法引用]或者说[双冒号运算]对应的参数类型是FunctionT表示传入类型,R表示返回类型。比如表达式person->person.getAge();
    16.         // 传入参数是person,返回值是person.getAge() 可替换成Person::getAge
    17.         Stream<Double> stream5 = Stream.generate(Math::random).limit(3);
    18.         stream5.forEach(System.out::println);

    二、常用API

    1、首先创建并构造对象list

    新建User对象

    1. package com.ruoyi.demo.domain;
    2. public class User {
    3.     private  String name;
    4.     private  int age;
    5.     public User(String name, int age) {
    6.         this.name = name;
    7.         this.age = age;
    8.     }
    9.     public String getName() {
    10.         return name;
    11.     }
    12.     public void setName(String name) {
    13.         this.name = name;
    14.     }
    15.     public int getAge() {
    16.         return age;
    17.     }
    18.     public void setAge(int age) {
    19.         this.age = age;
    20.     }
    21. }

    然后构造userlist

    1. private static List userList = new ArrayList();
    2.         //创建User集合
    3.         userList.add(new User("霸道",30));
    4.         userList.add(new User("的",40));
    5.         userList.add(new User("程序猿",50));
    6.         userList.add(new User("张三",60));
    7.         userList.add(new User("李四",70));

    2、过滤filter和遍历forEach

    1.         //api的使用-过滤filter和遍历forEach
    2.         //userList.stream().filter(user -> user.getAge() > 40).forEach(item -> System.out.println(item.getAge()));

    如果筛选条件是多个,比如筛选年龄介于40到70之间

    1.         //多个筛选,少选年龄介于40到70之间
    2.         //userList.stream().filter(user -> user.getAge() > 40 && user.getAge() < 70).forEach(item -> System.out.println(item.getAge()));

    3、匹配第一个findFirst

    1.         //匹配第一个findFirst
    2.         //System.out.println("匹配第一个findFirst:"+userList.stream().filter(user ->user.getAge()<60).findFirst().get().getName());

    4、是否包含符合特定条件的元素anyMatch

    1.         //是否包含符合特定条件的元素anyMatch
    2.         //System.out.println("是否包含年龄大于80的元素:"+userList.stream().anyMatch(user -> user.getAge()>80));

    5、按条件筛选特定条件的元素

    1.         //按条件筛选并形成新的集合collect(Collectors.toList())
    2.         //userList.stream().filter(user -> user.getAge() > 40).collect(Collectors.toList()).forEach(item->System.out.println(item.getAge()));

    6、聚合max、min、count

    1.         //聚合max min count
    2.         //获取User中年龄最大的,最小的同理
    3.         //Comparator<User> comparator = Comparator.comparing(User::getAge);
    4.         //System.out.println("聚合max,年龄最大的是:"+userList.stream().max(comparator).get().getAge());
    5.         //获取年龄大于40的个数
    6.         //System.out.println("年龄大于40的个数是:"+userList.stream().filter(x ->x.getAge()>40).count());

    7、map与flatmap

    1.         //map 与 flatmap
    2.         //map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
    3.         //给每个User的年龄加10 注意此时后面再次forEach的时候,每个item代表的是age,则不再是user了
    4.         //userList.stream().map(user -> user.getAge() + 10).collect(Collectors.toList()).forEach(item -> System.out.println(item));
    5.         //另外除了map之外还有一个flatmap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流

    8、reduce缩减,求和、求积、求最值

    1.         //规约reduce 把一个流缩减成一个值,能实现对集合求和、求乘积和求最值操作。
    2.         List<Integer> list = Arrays.asList(1, 2, 3, 4);
    3.         //求和
    4.         //Optional reduceAdd = list.stream().reduce((x, y)->x+y);
    5.         //求乘积
    6.         //Optional reduceMul = list.stream().reduce((x, y)->x*y);
    7.         //求最大值
    8.         Optional<Integer> reduceMax = list.stream().reduce((x, y)->x>y?x:y);
    9.         //System.out.println(reduceMax.get());

    9、收集toList、toSet、toMap

    1.         //收集 toList toSet toMap
    2.         //年龄大于50的User转换成map
    3.         Map<String,User> map = userList.stream().filter(user -> user.getAge()>50).collect(Collectors.toMap(User::getName,y->y));
    4.         //System.out.println(map);

    10、Collectors提供了一系列的用于数据统计的静态方法

    1.         //Collectors提供了一系列用于数据统计的静态方法
    2.         //计数
    3.         //System.out.println(userList.stream().collect(Collectors.counting()));
    4.         //求平均值
    5.         //System.out.println(userList.stream().collect(Collectors.averagingInt(User::getAge)));
    6.         //求和
    7.         //System.out.println(userList.stream().collect(Collectors.summingInt(User::getAge)));
    8.         //一次性统计所有(计数、求和、求平均、最大值、最小值)
    9.         //System.out.println(userList.stream().collect(Collectors.summarizingInt(User::getAge)));

    11、分组

    1.         //分组
    2.         //按照年龄是否大于50进行分组
    3.         Map<Boolean,List<User>> userPart = userList.stream().collect(Collectors.partitioningBy(user -> user.getAge()>50));
    4.         //System.out.println(userPart);
    5.         //按照年龄进行分组
    6.         Map<Integer,List<User>> userGroup = userList.stream().collect(Collectors.groupingBy(User::getAge));
    7.         //System.out.println(userGroup);

    12、连接

    1.        //连接joining可以将stream中的元素用特定的连接符(没有的话,则直接连接)连接成一个字符串。
    2.         String nameString = userList.stream().map(user -> user.getName()).collect(Collectors.joining("和"));
    3.         //System.out.println(nameString);

    13、排序

    1.         //排序sorted
    2.         //按照年龄升序排序
    3.         //System.out.println(userList.stream().sorted(Comparator.comparing(User::getAge)).map(User::getAge).collect(Collectors.toList()));
    4.         //按照年龄降序排序
    5.         //System.out.println(userList.stream().sorted(Comparator.comparing(User::getAge).reversed()).map(User::getAge).collect(Collectors.toList()));

    14、提取、组合

    1.         //提取、组合
    2.         String[] arr = {"1","2","3","4"};
    3.         String[] arr1 = {"3","4","5","6"};
    4.         Stream<String> stream = Stream.of(arr);
    5.         Stream<String> stream1 = Stream.of(arr1);
    6.         //concat合并两个流
    7.         //List collect = Stream.concat(stream, stream1).collect(Collectors.toList());
    8.         //System.out.println(collect);
    9.         //distinct去重
    10.         //List collect1 = Stream.concat(stream, stream1).distinct().collect(Collectors.toList());
    11.         //System.out.println(collect1);

    15、限制

    1.         //限制从流中获取前n个数据
    2.         //System.out.println(Stream.iterate(1,x -> x+2).limit(5).collect(Collectors.toList()));
    3.         //skip 跳过前n个数据
    4.         System.out.println(Stream.iterate(1,x -> x+2).skip(5).limit(5).collect(Collectors.toList()));

  • 相关阅读:
    springboot使用Mybatis中兼容多数据源的databaseId(databaseIdProvider)的简单使用方法
    55欧式空间02——正交矩阵、欧氏空间的同构
    数据解析——BeautifulSoup4
    大聪明教你学Java | SpringBoot 项目里如何在拦截器中获取 @RequestBody 参数
    基于SSM开发在线学习网站(前台+后台)
    Linux Centos 9保姆级系统安装教程
    关于面向对象的几大特性所能够解决的编程问题
    LeetCode 771. Jewels and Stones
    跟我学c++中级篇——c++11中的模板变参化
    WinDbg 远程调试遇到IP为:169.254.xx.xx 的处理
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657