前言
java8 stream 及 Lambda 表达式已经在之前章节介绍过,这里主要梳理一些常用的代码片段,便于使用查阅,人的记忆毕竟是有限的。
准备数据-- List
准备如下User对象集合
List<User> userList = new ArrayList<>();
userList.add(new User(1L, "a"));
userList.add(new User(2L, "b"));
userList.add(new User(2L, "c"));
userList.add(new User(3L, "d"));
userList.add(new User(3L, "e"));
list to map 转换
- 普通的处理 – 重复会有异常
Map<Long, String> userMap = ListUtils.emptyIfNull(userList).stream()
.collect(Collectors.toMap(User::getId, User::getUsername);
大家会发现有异常,其实Java8提供的Collectors.toMap() 方法中,其第三个参数就是当出现 duplicate key的时候的处理方案:
如下:
方案一: 出现重复时,取前面value的值,或者取后面放入的value值,则覆盖先前的value值。
Map<Long, String> userMap = ListUtils.emptyIfNull(userList).stream()
.collect(Collectors.toMap(User::getId, User::getUsername, (v1, v2) -> v1));
Map<Long, String> userMap = ListUtils.emptyIfNull(userList).stream()
.collect(Collectors.toMap(User::getId, User::getUsername, (v1, v2) -> v2));
方案二: Map的value可以储存一个list,把重复key的值放入list,再存到value中.
Map<Long, List<String>> userMap = ListUtils.emptyIfNull(userList).stream()
.collect(Collectors.toMap(User::getId,
e -> Arrays.asList(e.getUsername()),
(List<String> oldList, List<String> newList) -> {
oldList.addAll(newList);
return oldList;
}));
不过这种已经改变了目标map的结构。
排序
直接排序:
list.stream().sorted(Comparator.comparing(Student::getAge))
利用 ComparisonChain:
list.sort((o1, o2) -> ComparisonChain.start()
.compare(o1.getPid() == 0 ? 0 : 1, o2.getPid() == 0 ? 0 :1)
.result());
map循环
Map<String, Object> map = Maps.newHashMap();
循环1:
MapUtils.emptyIfNull(map).forEach((k, v) -> {
})
循环2:
MapUtils.emptyIfNull(map).entrySet().stream().forEach( t -> {
});
合并两个list为一个map
场景:
/**
* keys [1,2,3,2] values [10,20,40,40] ----> {1:10,2:60,3:40}
**/
Map<Integer,Integer> twolistToMap(List<Integer> keys, List<Integer> values){
return IntStream.range(0,keys.size())
.boxed()
.collect(Collectors.toMap(keys::get,values::get,(e1,e2)->e1+e2));
}
总结
持续更新代码片段。