Lambda表达式由三部分组成:
paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断1。另外当只有一个推断类型时可以省略掉圆括号。
->:可理解为“被用于”的意思
方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。
1. list to map
public class UserBean {
private String userName;
private Integer age;
private String aihao;
public UserBean(String userName,Integer age,String aihao){
this.userName = userName;
this.age = age;
this.aihao = aihao;
}
}
List<UserBean> userList = new ArrayList<>();
UserBean userBean = new UserBean("张三",21,"热爱学习");
userList.add(userBean);
userBean = new UserBean("张三2", 25,"热爱学习2");
userList.add(userBean);
userBean = new UserBean("张三", 27,"热爱学习3");
userList.add(userBean);
userBean = new UserBean("张三4", 26,"热爱学习2");
userList.add(userBean);
System.out.println(userList);
// list of UserBean 转 Map<String,Integer> map
Map<String,Integer> map =
userList.stream().collect(Collectors.toMap(UserBean::getUserName, UserBean::getAge,
(key1,key2) ->key2));
System.out.println("----map"+ JSONObject.toJSONString(map));
// list of UserBean 转 Map<String,UserBean> userBeanMap
Map<String,UserBean> userBeanMap =
userList.stream().collect(Collectors.toMap(UserBean::getUserName, Function.identity(),
(key1,key2) ->key2));
System.out.println("----userBeanMap"+ JSONObject.toJSONString(userBeanMap));
// list of UserBean 转 Map<String,UserBean> userBeanMap if check
Map<String, UserBean> userMapCheck = new HashMap<>();
userList.forEach(userBean1 -> {
if( userBean1.getAge() != null && userBean1.getAge().intValue() > 25){
userMapCheck.put(userBean1.getUserName(),userBean1) ;
}
});
System.out.println("----userMapCheck"+ JSONObject.toJSONString(userMapCheck));
// 方式2:使用流过滤,再使用foreach遍历
Map<String, String> alarmObjUuidMap2 = new HashMap<>();
alarmInfoResponseList.stream().
filter(alarmInfoResponse -> !"-1".equals(alarmInfoResponse.getObjUuid())).
forEach(alarmInfoResponse -> alarmObjUuidMap2.put(alarmInfoResponse.getAlarmUuid(), alarmInfoResponse.getObjUuid()));
System.out.println("\n============= 方式2 ====================");
alarmObjUuidMap2.forEach((alarmUuid, objUuid) -> System.out.println(alarmUuid + " : " + objUuid));
list to map ,按照key分组,key不允许为null.
Map<Integer, List<UserBean>> groupBy = userList.stream().collect(Collectors.groupingBy(UserBean::getAge)) ;
System.out.println(JSON.toJSONString(groupBy));
list lambda 取出某一列
List<String> names = userList.stream().map(p -> p.getUserName()).collect(Collectors.toList());
list 安照字段排序
List<EquipOverrunRecord> recordList = equipOverrunRecordService.findAll();
Collections.sort(recordList, new Comparator<EquipOverrunRecord>() {
@Override
public int compare(EquipOverrunRecord o1, EquipOverrunRecord o2) {
Double v1 = o1.getPeakValue();
Double v2 = o2.getPeakValue();
if (v1 != null && v2 != null) {
return v1.compareTo(v2);
} else {
return v1 == null ? 1 : -1;
}
}
});
lambda 排序 (降序)
userList.sort(Comparator.comparing(UserBean::getCreateTime, Comparator.nullsLast(Date::compareTo)).reversed());
list 过滤filter
userList = userList.stream().filter(s -> {
return s.getCreateTime() != null ;
}).collect(Collectors.toList());
List 单个id值去重
List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4);
List<Integer> distinct = numbers.stream().distinct()
.collect(Collectors.toList());
System.out.println(JSON.toJSONString(distinct));
2. map 使用
1.遍历map
可以先判断是否为空
CollectionUtils.isEmpty(userMapCheck);
userMapCheck.forEach((key, value) -> {
System.out.println("Key: " + key + ", Value: " + JSONObject.toJSONString(value));
System.out.println(" value.getAge(): " + value.getAge() );
});
2. 两个同样的map合并
方式1
Map<String, UserBean> result = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(value1, value2) -> value2));
System.out.println(JSON.toJSONString(result));
方式2
Map<String, UserBean> map3 = Stream.of(map1, map2)
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> v2 ));