1、在工作中我们有部分lamda表达式经常会用到,在此做个小总结
这里新建个实体类,来做测试
public class LamdaVO {
private Integer id;
private String name;
private String eamil;
public LamdaVO() {
}
public LamdaVO(Integer id, String name, String eamil) {
this.id = id;
this.name = name;
this.eamil = eamil;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEamil() {
return eamil;
}
public void setEamil(String eamil) {
this.eamil = eamil;
}
@Override
public String toString() {
return "LamdaVO{" +
"id=" + id +
", name='" + name + '\'' +
", eamil='" + eamil + '\'' +
'}';
}
}
对lamda用的比较多的几种,做一下展示
public class FreemakeraddApplicationTests {
@Test
public void lamdaTest() {
List<LamdaVO> lamdaVOList = new ArrayList<>();
LamdaVO user1 = new LamdaVO(1, "小明", "12324qq.com");
LamdaVO user2 = new LamdaVO(2, "小芳", "12324qq.com");
LamdaVO user3 = new LamdaVO(3, "小华", "12324qq.com1");
LamdaVO user4 = new LamdaVO(4, "小华", "12324qq.com2");
lamdaVOList.add(user1);
lamdaVOList.add(user2);
lamdaVOList.add(user3);
lamdaVOList.add(user4);
//lamda表达式 过滤加遍历
System.out.println("lamda表达式 过滤加遍历");
lamdaVOList.stream().filter(u -> u.getId() > 1).
forEach(u -> System.out.println(u.getId() + ":::" + u.getName()));
//lamda表达式对提取为map对象
// Map<String, String> map = lamdaVOList.stream().
// collect(Collectors.toMap(LamdaVO::getName, LamdaVO::getEamil));
//如果采用上面方式需要特别注意,使用Collectors.toMap时,需要保证生成map的唯一性,否则会报
// java.lang.IllegalStateException: Duplicate key 错误。可以采用下面的方式规避,
//下面 (o, n) -> o表示的 如果出现重复key,则用 原来代替新的key,所以打印的小华的邮箱 为
// 小华::12324qq.com1.同样可以使用 (o, n) -> n 这样当出现重复key时候,则会用新的key代替老的key了,
// 此时 打印的小华的邮箱 则为 小华::12324qq.com2
System.out.println("lamda表达式对提取为map对象");
Map<String, String> map = lamdaVOList.stream().
collect(Collectors.toMap(LamdaVO::getName, LamdaVO::getEamil, (o, n) -> o));
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey()+"---"+entry.getValue());
}
//lamda 表达式对对象里面某个属性提取List对象
System.out.println("lamda 表达式对对象里面某个属性提取List对象");
List<String> list = lamdaVOList.stream().map(LamdaVO::getName).collect(Collectors.toList());
list.stream().forEach(s-> System.out.println(s));
//lamda表达式变为map<String,List<String>>
System.out.println("lamda表达式变为map<String,List<String>>");
Map<String, List<LamdaVO>> map2 = lamdaVOList.stream().collect(Collectors.groupingBy(LamdaVO::getName));
for (Map.Entry<String, List<LamdaVO>> entry : map2.entrySet()) {
System.out.println(entry.getKey()+"::"+entry.getValue());
}
}
}
查看lamda表达式的输出结果:
我们在使用lamda表达式排序的时候,很多时候考虑到空指针可能会选择传统的方式,lamda实际上也有防止空指针的排序。
@Test
public void lamdaCompareTest(){
LamdaVO lamdaVO1 = new LamdaVO(null, "name1", "eamil1");
LamdaVO lamdaVO2 = new LamdaVO(2, "name2", "eamil2");
LamdaVO lamdaVO3 = new LamdaVO(3, "name3", "eamil3");
LamdaVO lamdaVO4 = new LamdaVO(null, "name4", "eamil4");
LamdaVO lamdaVO5 = new LamdaVO(5, "name5", "eamil6");
List<LamdaVO> lamdaLst = new ArrayList<>();
lamdaLst.add(lamdaVO1);
lamdaLst.add(lamdaVO2);
lamdaLst.add(lamdaVO3);
lamdaLst.add(lamdaVO4);
lamdaLst.add(lamdaVO5);
List<LamdaVO> nullLastPositive = lamdaLst.stream().sorted(Comparator.comparing(LamdaVO::getId, Comparator.nullsLast(Integer::compareTo))).collect(Collectors.toList());
System.out.println("null在最后正序:"+nullLastPositive);
List<LamdaVO> nullLastReverse = lamdaLst.stream().sorted(Comparator.comparing(LamdaVO::getId, Comparator.nullsLast(Integer::compareTo)).reversed()).collect(Collectors.toList());
System.out.println("null在最后正序:"+nullLastReverse);
List<LamdaVO> nullFirst = lamdaLst.stream().sorted(Comparator.comparing(LamdaVO::getId, Comparator.nullsFirst(Integer::compareTo))).collect(Collectors.toList());
System.out.println("null在最前:"+nullFirst);
List<LamdaVO> list = lamdaLst.stream().sorted(Comparator.comparing(LamdaVO::getId)).collect(Collectors.toList());
System.out.println(list);
}
结果:
在排序中添加类似这种Comparator.nullsLast(Integer::compareTo)) ,是可以防止lamda报空指针异常的
转载自原文链接, 如需删除请联系管理员。
原文链接:常用Lamda表达式,转载请注明来源!