stream流的本质:
将list,map转换成stream,然后进行一番操作(filter,forEach,collect等等)
例如:
List<String> list = new ArrayList<String>(){{add("1");add("2");add("3");add("4");add("5");}};
List<String> list2 = new ArrayList<>();
list.stream().filter(o->o.equals("2")||o.equals("3")||o.equals("4")).forEach(o->list2.add(o));
第3行可以拆成两部分,list.stream().filter(o->o.equals("2")||o.equals("3")||o.equals("4"))和 stream.forEach(o->list2.add(o))
list.stream().filter()会得到一个stream,这个stream是筛选出来的结果。可以用这个stream进行forEach(),将里面的结果给到其他的list,map,对象等,也可以collect(Collectors.toList())生成ArrayList。
但本质上就是拿到一个stream,再对他进行操作。
并行流
jdk8 stream与parallelStream实现源码阅读_benet-xiao的博客-CSDN博客_java parallelstream 源码
Optional的orElse等用法
Optional.ofNullable(value).orElse(default);
String[] items = {"增","删","改"};
Stream<String> s = Arrays.stream(items).filter(o -> o.equals("增1"));
Optional<String> first = s.findFirst();
String result = first.orElse("没有值");
list.stream().filter(o -> o.equals("增1")).findFirst().orElse(defaultValue);
关于optional的orElse和orElseGet、orElseThrow - 简书
Collectors.toMap
Map<Long, SonRoot> map= fatherlist.stream().collect(Collectors.toMap(FatherRoot::getCode, info -> info, (k1, k2) -> k1));
Java8 中 List 转 Map(Collectors.toMap) 使用技巧 | 张振伟的博客
map用法 元素类型转换
//需求:入参是逗号隔开的usercode,实体类中是long类型的list,在@Mapper字段映射前,需要对usercode处理,转换成List<Long>
String usercode = "111,222,333";
String[] users = str.split(",");
List<Long> collect = Arrays.stream(users).map(o -> Long.valueOf(o)).collect(Collectors.toList());
list转map操作
Collectors.toMap(),重复的key,如何取其中1个,或者拼接,或者装list
案例:字典关联表,src_id,src_val,dest_id,dest_val
以src_id和dest_id为key,将一个装有多个map(一个map装了一行src_id,src_val,dest_id,dest_val)的list转成key(src_id,dest_id)=val(list[{src_id,src_val,dest_id,dest_val},{src_id,src_val,dest_id,dest_val}]),
list.stream().collect(Collectors.toMap(o->o.get("s_id")+"|"+o.get("d_id"), o -> o))
如果用toMap(),则会出现dublicate key报错,因为关联表大多是这样的:
src_id src_val dest_id dest_val update_time
SUBSYS_UF 00 SUBSYS_UFX 5 2021-08-26 11:12:04
SUBSYS_UF 01 SUBSYS_UFX 1 2021-08-26 11:12:04
SUBSYS_UF 02 SUBSYS_UFX 12 2021-08-26 11:12:04
SUBSYS_UF 03 SUBSYS_UFX 3 2021-08-26 11:12:04
两个id一样,会出现多个。这时候需要用groupingBy
Map<Long, List<User>> map = users.stream().collect(Collectors.groupingBy(User::getId));
Java 8 :List 转 Map 之 Collectors.toMap()_小白一个-CSDN博客_collector.tomap
去重
分享几种 Java8 中通过 Stream 对列表进行去重的方法 - 知乎
list.stream().map().collect()
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// 获取对应的平方数
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
list.stream().map().collect()_freedom-CSDN博客_list.steam().map
Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合_云深i不知处的博客-CSDN博客_java stream 聚合