第二课:Lambda表达式详解内容
java1.8中lambda表达式
一下是关于lambda中的常规的用法内容;
1.将map中的value转成对应的list集合内容
Map<String,UserEntity>map = new HashMap<>();
UserEntity entity = null;
for (int i = 0; i < 10; i++) {
entity = new UserEntity();
entity.setCode("code"+i);
entity.setId(i);
entity.setName("小康康"+i);
map.put(entity.getCode(), entity);
}
//这个是将map中的value转到list 里面存放
List<UserEntity> list = map.entrySet().stream().map(e->e.getValue()).collect(Collectors.toList());
//循环打印对象内容
list.forEach(e->System.out.println(JSON.toJSONString(e)));
//下面的这种方式也是只是转成list的格式不同
List<UserEntity> list1 = map.entrySet().stream().map(e->e.getValue()).collect(Collectors.toCollection(ArrayList::new));
2.将list的对象转成map指定属性作为key
上一步的list通过下面转换成map code作为key,对象作为value
Map<String, UserEntity> map1 = list.stream().collect(Collectors.toMap(UserEntity::getCode,e->e));
3.list集合排序使用
//默认是按照code 从小到大排序
list.sort(Comparator.comparing(UserEntity::getCode));
//这个排序默认是按照UserEntity code 从大到小排列的
list.sort((u1,u2)->u2.getCode().compareTo(u1.getCode()));
4.通过filter获取元素信息内容
//如果直接这么写 如果集合中没有匹配到直接抛出异常/如果匹配到则直接返回 可以使用下面的 orElse(null),如果没有匹配到设置为空
UserEntity userEntity = list.stream().filter(e->e.getCode().equals("code9")).findAny().get();
//为了防止出现异常
UserEntity userEntity1 = list.stream().filter(e->e.getCode().equals("code5")).findAny().orElse(null);
//将匹配到的设置到指定的对象中去
List<UserEntity> list2 = list.stream().filter(e->e.getCode().equals("code9")).collect(Collectors.toList());
5.list里面的去重的操作内容
List<UserEntity>list3 = new ArrayList<UserEntity>(){{
add(new UserEntity(1, 100, "candy"));
add(new UserEntity(2, 100, "candy"));
add(new UserEntity(3, 200, "candy"));
add(new UserEntity(4, 200, "小康"));
add(new UserEntity(5, 200, "小康"));
add(new UserEntity(6, 300, "candy1"));
add(new UserEntity(7, 300, "candy2"));
add(new UserEntity(8, 300, "candy3"));
add(new UserEntity(9, 400, "candy4"));
}};
//根据list元素的的name去重
List<UserEntity> collect3 = list3.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getName()))),ArrayList::new));
//这个是将list 按照集合中的某个元素的属性值进行分组成map结构 按照money作为key,对象的集合作为value
Map<Integer, List<UserEntity>> collect4 = list3.stream().collect(Collectors.groupingBy(UserEntity::getMoney));
//这个是将list 按照集合中的某个元素的属性值进行分组成map结构 按照money作为key 元素的个数作为value
Map<Integer, Long> collect6 = list3.stream().collect(Collectors.groupingBy(UserEntity::getMoney,Collectors.counting()));
//获取list里面元素的获取name重复的
List<String> collect8 = list3.stream().collect(Collectors.groupingBy(e->e.getName(),Collectors.counting())).entrySet().stream().filter(e->e.getValue() > 1).map(e->e.getKey()).collect(Collectors.toList());
//获取list里面的元素的name不重复的
List<String> collect9 = list3.stream().collect(Collectors.groupingBy(e->e.getName(),Collectors.counting())).entrySet().stream().filter(e->e.getValue() == 1).map(e->e.getKey()).collect(Collectors.toList());
6.集合中的运算操作
6.1集合中元素中某个属性计算结果
List<UserEntity>list4 = new ArrayList<UserEntity>(){{
add(new UserEntity(1, 100, "candy",new BigDecimal("100")));
add(new UserEntity(2, 100, "candy",new BigDecimal("100")));
add(new UserEntity(3, 200, "candy",new BigDecimal("100")));
add(new UserEntity(4, 200, "小康",new BigDecimal("100")));
add(new UserEntity(5, 200, "小康",new BigDecimal("100")));
add(new UserEntity(6, 300, "candy1",new BigDecimal("100")));
add(new UserEntity(7, 300, "candy2",new BigDecimal("100")));
add(new UserEntity(8, 300, "candy3",new BigDecimal("100")));
add(new UserEntity(9, 400, "candy4",new BigDecimal("100")));
}};
// 获取集合对象中的某个属性的和
BigDecimal result = list4.stream().filter(e->e.getName().equals("candy")).map(e->e.getScore()).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
System.out.println("用户名为candy所有用户的score 总数是"+result);
Integer result2 = list4.stream().filter(e->e.getName().equals("candy")).map(e->e.getMoney()).reduce((e,r)->e+r).orElse(0);
System.out.println("方式1:用户名为candy所有用户的money 总数是"+result2);
result2 = list4.stream().filter(e->e.getName().equals("candy")).map(e->e.getMoney()).reduce(0,Integer::sum);
System.out.println("方式2:用户名为candy所有用户的money 总数是"+result2);
6.2 集合中元素获取最大值/最小值
最大值/最小值相同的有多个元素 总是顺序去第一个元素的
List<UserEntity>list5 = new ArrayList<UserEntity>(){{
add(new UserEntity(1, 100, "小康康1",new BigDecimal("1001")));
add(new UserEntity(2, 100, "小康康2",new BigDecimal("1002")));
add(new UserEntity(3, 200, "小康康3",new BigDecimal("1003")));
add(new UserEntity(4, 50, "小康康4",new BigDecimal("1004")));
add(new UserEntity(5, 200, "小康康5",new BigDecimal("1005")));
add(new UserEntity(6, 300, "candy1",new BigDecimal("1006")));
add(new UserEntity(7, 300, "candy2",new BigDecimal("1007")));
add(new UserEntity(8, 300, "candy3",new BigDecimal("1008")));
add(new UserEntity(9, 400, "candy4",new BigDecimal("1009")));
}};
String maxScoreUserName = list5.stream().max(Comparator.comparing(UserEntity::getScore)).map(e->e.getName()).orElseGet(null);
System.out.println("方式1:查询 集合中score最高的用户"+maxScoreUserName);
maxScoreUserName = list5.stream().collect(Collectors.maxBy(Comparator.comparing(UserEntity::getScore))).map(e->e.getName()).orElseGet(null);
System.out.println("方式2:查询 集合中score最高的用户"+maxScoreUserName);
maxScoreUserName = list5.stream().reduce((x,y)-> x.getScore().compareTo(y.getScore())>0 ? x : y).map(e->e.getName()).orElseGet(null);
System.out.println("方式3:查询 集合中score最高的用户"+maxScoreUserName);
BigDecimal bigDecimal = list5.stream().map(e->e.getScore()).reduce(BigDecimal::max).get();
System.out.println("查询 集合中score最高值:"+bigDecimal);
String mminScoreUserName = list5.stream().min(Comparator.comparing(UserEntity::getMoney)).map(e->e.getName()).orElseGet(null);
System.out.println("方式1:查询 集合中money最小的用户"+mminScoreUserName);
maxScoreUserName = list5.stream().reduce((x,y)-> x.getMoney().compareTo(y.getMoney())<0 ? x : y).map(e->e.getName()).orElseGet(null);
System.out.println("方式2:查询 集合中money最小的用户"+mminScoreUserName);
Integer totalMoney = list5.stream().collect(Collectors.summingInt(UserEntity::getMoney));
System.out.println("list5中的总金额"+totalMoney);
Double averagingMoney = list5.stream().collect(Collectors.averagingInt(UserEntity::getMoney));
System.out.println("list5中的金额平均值"+averagingMoney);
6.3 集合拼接成字符串
String result3 = list4.stream().filter(e->(e.getId()<4)).map(e->e.getName()).collect(Collectors.joining(","));
System.out.println("用户id小于4的用户名"+result3);
//用户id小于4的用户名candy,candy,candy
以上就是关于lambda表达式的常规用法;基本上通过stream能完成容器的大部分的操作内容.