Java8的stream如果使用得当,会非常方便,竟然会有点跑sql的感觉,我将常见的几种用法总结了一下,后续再继续整理补充
- group by 用法,注意返回的必须是个Map!可参照源码groupingBy(classifier, HashMap::new, downstream)第二个参数
if (!derateInfos.isEmpty()) {
derateInfoMap
= derateInfos.stream().collect(
Collectors
.groupingBy(r->r.getLoanId(), Collectors.mapping(r->r.getRepayTerm(), Collectors.toList()))
);
}
- 列表转Map
Map<Long, Warrant> warrantMap = warrants.stream().collect(Collectors.toMap(r->r.getId(),r->r));
如果想要用此方法来去重,由于key重复时会报一个“Duplicate key”的异常,因此需要在表达式中加入重复选择策略
Map<String, String> distinctProc = nodeConfigs.stream()
.collect(Collectors.toMap(r->r.getProcKey(),r->r.getProcName(),(v1,v2)->v2));
意为当key重复时,使用后一个值v2覆盖前一个值v1
- 提取对象属性
List<String> serviceActIds=servieNodeConfig.stream().map(r->r.getActId()).collect(Collectors.toList());
- filter用法
List<User> collect = list.stream()
.filter(user -> user.getAge()<30 && "女".equals(user.getSex()))
.collect(Collectors.toList());
- Map用法
Map<String,String> warrantParams;
Map<String,String> varsMap;
......
warrantParams.forEach((k,v)->{
varsMap.merge(k, v, (oldValue, newValue) -> newValue); //如果遇到相同的key则取新值,这里还可以按需写更复杂的逻辑
});
- 排序
Comparator<RavDataschemeButton> comparator = Comparator.comparing(RavDataschemeButton::getOrderNo);
buttons.sort(comparator); //正序
buttons.sort(comparator.reversed());//倒序
- Map排序
TreeMap<String,String> attributes= new TreeMap<String,String>((String a,String b)->a.compareTo(b));