java stream 常用操作

示例1

 1
 2// 过滤数据,并获取数量
 3list.stream().filter(geoInfo -> beforeData.getId().equals(geoInfo.getId())).count();
 4
 5// 过滤数据,并获取第一个元素
 6list.stream().filter(before -> before.getId().equals(geoInfo.getId())).findFirst().get();
 7
 8// 获取对象的某一个字段值,并用逗号拼接
 9list.stream().map(site -> site.getSiteId()).collect(Collectors.joining(","));
10
11// 获取对象某个属性的最大值(orElse(0)表示如果为null,就设置最大值为0)
12list.stream().map(SysDictItemDto::getSortOrder).max(Comparator.comparingInt(x -> x)).orElse(0)
13
14// 流的复用
15// Java 8 Stream 流已被操作或关闭,在Java 8中,Stream不能重复使用,一旦被使用,流将被关闭。我们可以巧用java 8的Suppliers接口实现流重用
16// Supplier接口产生一个给定类型的结果。与Function不同的是,Supplier没有输入参数。
17String[] array = {"1","2","3","4","5","6","7"};
18Supplier<Stream<String>> streamSupplier = () -> Stream.of(array);
19//get一个新的stream
20streamSupplier.get().forEach(System.out::println);
21//再次get一个新的stream
22streamSupplier.get().forEach(System.out::println);

示例2

 1//获取对象集合中某字段的数字和(不会出现空指针)
 2int = 集合对象.stream().mapToInt(集合的对象类名::某字段的get方法).sum()
 3
 4//向对象集合中所有对象放入同一字段值(不会出现空指针)
 5集合对象.forEach(函数对象(任意值) -> 函数对象.某字段的set方法(输入的值));
 6
 7//获取对象集合中某些字段形成新的集合
 8List = 集合对象.stream().map(函数对象(任意值) -> new 集合的对象类名(函数对象.getUserName(),函数对象.getAge())).collect(Collectors.toList());
 9 
10//查询对象集合中指定范围的对象形成新的集合(会出现空指针)
11List = 集合对象.stream().filter(函数对象(任意值) -> 条件).collect(Collectors.toList());
12 
13//查询对象集合中的某字段形成新的集合
14List = 集合对象.stream().map(集合的对象类名::某字段的get方法).collect(Collectors.toList());
15 
16// 求最高值
17Optional<Integer> 新的集合对象 = 集合对象.stream().map(集合的对象类名::对象的get方法).collect(Collectors.maxBy(Integer::compare));
18 
19// 将List集合转换为Map集合
20// 注意key是唯一的,要注意他不会自动去掉重复key,而是抛出异常,我们需要手动处理
21Map<String, String> 新的集合对象 = List集合对象.stream().collect(Collectors.toMap(List集合对象类名::对象的属性get方法(作为key), List集合对象类名::对象的属性get方法(作为value), (如果需要去重则添加(k1, k2) -> k2 表示后添加的key是否替换之前的key)))
22 
23// 按照某字段不同分组
24Map<String, List<集合的对象类名>> 新的集合对象 = 集合对象.stream().collect(Collectors.groupingBy(集合的对象类名::对象的get方法));
25 
26// 按照一定条件分组
27Map<Boolean, List<集合的对象类名>> 新的集合对象 = 集合对象.stream().collect(Collectors.partitioningBy(函数对象(任意值) -> 判断条件));
28 
29//将集合内容串联成一个字符串
30String string = 集合对象.stream().collect(Collectors.joining("串联的中间字符"));
31 
32// 按某字段自然排序(正序)
33List<String> newList = 集合对象.stream().sorted(Comparator.comparing(集合的对象类名::被比较的对象的get方法)).map(集合的对象类名::转换导出字段的get方法).collect(Collectors.toList());
34 
35// 给Integer集合进行自然排序(正序)
36List<Integer> newList2 = 集合对象.stream().sorted(Comparator.comparing(Integer::intValue)).collect(Collectors.toList())
37 
38// 按某字段倒叙
39List<String> newList3 = 集合对象.stream().sorted(Comparator.comparing(集合的对象类名::被比较的对象的get方法).reversed()).map(集合的对象类名::转换导出字段的get方法).collect(Collectors.toList());
40 
41// 先按工资再按年龄升序排序
42List<String> newList4 = 集合对象.stream().sorted(Comparator.comparing(集合的对象类名::被比较的对象的get方法1).thenComparing(集合的对象类名::被比较的对象的get方法2)).map(集合的对象类名::转换导出字段的get方法).collect(Collectors.toList());