stream 简单使用

​1. 简单 for循环
list.stream().forEach(e ->e.setValue(value));
list.forEach(e ->e.setValue(value));
list.forEach(e ->{ … });

2.过滤: filter(T -> boolean)
list.stream() .filter(过滤条件) .collect(Collectors.toList())
如:
List list = aList.stream() .filter(a -> “value”.equals(a.getValue())) .collect(Collectors.toList());

3.分组
Map<Object,List> consInfoGroupMap =
list.stream().collect(Collectors.groupingBy(Object::getValue));
如:名字相同的 List
Map<String, List> consInfoGroupMap =
userList.stream().collect(Collectors.groupingBy(User::getName));
如:名字相同的 Long多少人
Map<String, Long> consInfoGroupMap =
userList.stream().collect(Collectors.groupingBy(
User::getName,Collectors.counting()));

3.1 多级分组
groupingBy 可以接受一个第二参数实现多级分组:
Map<Integer, Map<T, List>> map =
list.stream().collect(groupingBy(User::getAge, groupingBy(…)));
其中返回的 Map 键为 Integer 类型,值为 Map<T, List> 类型,即参数中 groupBy(…) 返回的类型

4.根据字段排序 sorted() / sorted((T, T) -> int)
List items =
list().stream().sorted(Comparator.comparing(Object::getValue))
.collect(Collectors.toList());
如:根据年龄排序
List items =
list().stream().sorted(Comparator.comparing(User::getAge))
.collect(Collectors.toList());
如:过滤加排序 全部男人根据age排序
List userList =
list.stream().filter(temp -> temp.getSix().equals(“男人”)).sorted(Comparator
.comparing(temp -> temp.getAge())).collect(Collectors.toList());

  1. 返回前 n 个元素 limit(long n)
    如:返回前两个user 对象
    List userList = list.stream().limit(2).collect(toList());

  2. 去除前 n 个元素 skip(long n)
    如:去除钱两个User对象后,返回其余 user 对象
    List userList = list.stream().skip(2).collect(toList());

tips :
skip(m) 用在limt(n)前面时,先去除前面m个元素再返回剩余元素的前n个元素
limit(n) 用在skip(m)前面时,先返回前n个元素再在剩余的n个元素中去除m个元素

  1. map(T -> R) 获取集合 中对象的value属性的值
    将流中的每一个元素 T 映射为 R(类似类型转换)

List values =
list.stream().map(Object::getValue).collect(Collectors.toList());
List values =
list.stream().map(x -> x.getValue()).collect(Collectors.toList());
如:List names =
list.stream().map(User::getName).collect(Collectors.toList());

  1. flatMap(T -> Stream)
    将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流
    List list = new ArrayList<>();
    list.add(“aaa,bbb,ccc”);
    list.add(“ddd,eee,fff”);
    list.add(“ggg,hhh,iii”);

list =
list.stream().map(p -> p.split(","))
.flatMap(Arrays::stream).collect(toList());
我们的目的是把 List 中每个字符串元素以","分割开,变成一个新的 List。
首先 map 方法分割每个字符串元素,但此时流的类型为 Stream<String[ ]>,因为 split 方法返回的是 String[ ] 类型;所以我们需要使用 flatMap 方法,先使用Arrays::stream将每个 String[ ] 元素变成一个 Stream 流,然后 flatMap 会将每一个流连接成为一个流,最终返回我们需要的 Stream

  1. anyMatch(T -> boolean)
    流中是否有一个元素匹配给定的 T -> boolean 条件
    是否存在一个 user 对象的 age 等于 20:
    boolean b = list.stream().anyMatch(user -> user .getAge() == 20);

  2. allMatch(T -> boolean)
    流中是否所有元素都匹配给定的 T -> boolean 条件

  3. noneMatch(T -> boolean)
    流中是否没有元素匹配给定的 T -> boolean 条件

  4. findAny() 和 findFirst()
    findAny():找到其中一个元素
    使用 stream() 时找到的是第一个元素;
    parallelStream() 并行时找到的是其中一个元素
    findFirst():找到第一个元素
    值得注意的是,这两个方法返回的是一个 Optional 对象,它是一个容器类,能代表一个值存在或不存在

  5. reduce((T, T) -> T) 和 reduce(T, (T, T) -> T)
    用于组合流中的元素,如求和,求积,求最大值等
    计算年龄总和:
    int sum = list.stream().map(User::getAge).reduce(0, (a, b) -> a + b);
    相同写法:
    int sum = list.stream().map(User::getAge).reduce(0, Integer::sum);
    其中,reduce 第一个参数 0 代表起始值为 0,
    lambda (a, b) -> a + b 即将两值相加产生一个新值
    同样地:
    计算年龄总乘积:
    int sum = list.stream().map(User::getAge).reduce(1, (a, b) -> a * b);
    当然也可以
    Optional sum
    = list.stream().map(User::getAge).reduce(Integer::sum);
    即不接受任何起始值,但因为没有初始值,需要考虑结果可能不存在的情况,因此返回的是 Optional 类型

  6. count()
    返回流中元素个数,结果为 long 类型

  7. collect()
    收集方法,我们很常用的是 collect(toList()),当然还有 collect(toSet()) 等,参数是一个收集器接口

  8. joining 连接字符串
    也是一个比较常用的方法,对流里面的字符串元素进行连接,其底层实现用的是专门用于字符串连接的 StringBuilder
    将User 的getName值 进行连接

String s = list.stream().map(User::getName).collect(joining());

将User 的getName值 用",“进行连接
String s = list.stream().map(User::getName).collect(joining(”,"));

结果:name1,name2,name3
joining 还有一个比较特别的重载方法:
String s = list.stream().map(User::getName).collect(joining(" and ", "Today “, " play games.”));

结果:Today name1 and name2 and name3 play games.
即 Today 放开头,play games. 放结尾,and 在中间连接各个字符串

猜你喜欢

转载自blog.csdn.net/weixin_42160856/article/details/91362758