Java Lambda表达式
文章目录
-
集合对象单个属性抽取封装(map)
// 抽取为Set集合 Set<Integer> userIdSet = list.stream() .map(Model::getUserId).collect(Collectors.toSet()); // 抽取为List Set<Integer> userIdSet = list.stream() .map(Model::getUserId).collect(Collectors.toList());
-
集合对象多属性抽取(flatMap)
Set<Integer> userIds = list.stream() .flatMap(e -> Stream.of(e.getCreateId(), e.getUpdateId())) .collect(Collectors.toSet());
-
集合转换为Map
第一个参数 Model::getItemId表示选择 Model的 getItemId作为map的key值;
第二个参数 Model::getId 表示选择将原来的对象作为map的value值,如选择对象作为value值:model -> model;Map<Integer, Integer> map = list.stream() .collect(Collectors.toMap(Model::getItemId, Model::getId);
-
集合转换为Map,键值重复获取第一个
第三个参数 (value1, value2)-> value2) 中,如果value1与value2的key值相同,选择value1作为那个key所对应的value值。Map<Integer, Integer> map = list.stream() .collect(Collectors.toMap(Model::getItemId, Model::getId, (value1, value2)-> value2));
-
集合按照某个属性分组(groupingBy)
// 按照日期分组 Map<Integer, List<Model>> listMap = list.stream() .collect(Collectors.groupingBy(Model::getDate)); // 多次分组,先按用户id分组,在按照日期分组 // map:{k: 用户id, v:map:{日期时间戳,对象}} Map<Integer, Map<Integer, List<Model>>> = list.stream() .collect(Collectors.groupingBy(Model::getUserId, Collectors.groupingBy(Model::getDate))); // 按照用户id分组,value抽取对象某个属性 // map:{k:用户id, v: 角色id集合} Map<Integer, Set<Integer>> = list.stream() .collect(Collectors.groupingBy(Model::getUserId, Collectors.mapping(Model::getRoleId, Collectors.toSet()))); // 角色id分组,value为对象map // map:{k: 角色id, v: map:{用户id, 日期}} Map<Integer, Map<Integer, Integer>> = list.stream() .collect(Collectors.groupingBy(Model::getRoleId, Collectors.toMap(Model::getUserId, Model::getDate))); // 内部类对象处理,内部类为静态类才可以使用 Map<Integer, List<Model.Offer>> orderIdMap = offerList.stream() .collect(Collectors.groupingBy(Model.Offer::getOrderId)); // 商品sku数量累加 k: 商品sku, v: 商品数量 Map<String, DoubleSummaryStatistics> repeatSkuMap = tradeDtDTOList.stream() .collect(Collectors.groupingBy(Model::getSku, Collectors.summarizingDouble(Model::getNum))); // 统计常用方法,浮点数用:DoubleSummaryStatistics,整型用:IntSummaryStatistics DoubleSummaryStatistics value = entry.getValue(); System.out.println("最大值 : " + value.getMax()); System.out.println("最小值 : " + value.getMin()); System.out.println("累加 : " + value.getSum()); System.out.println("平均值 : " + value.getAverage());
-
其他常用表达式
// 整型集合累加 Integer sum = list.stream().mapToInt((s) -> s).sum(); // 集合过滤后数据size // 获取用户状态为1的数据size long count = list.stream().filter((Model model) -> model.getStaus.equals(1)).count(); // 字符集合转为整型集合 List<Integer> intList = stringList.stream() .map(String::valueOf).map(Integer::valueOf) .collect(Collectors.toList())); // NULl值判断处理,为null赋值0 Map<Integer, Integer> map = list.stream().collect(Collectors.toMap(Model::getId, e -> Optional.ofNullable(e.getId()).orElse(0))); // 获取最大时间记录 Model model = list.stream().max(Comparator.comparing(Model::getTime)).get(); // 获取最小时间记录 Model model = list.stream().min(Comparator.comparing(Model::getTime)).get();
-
过滤
// 获取用户id大于50 小于100用户数据集合 List<Model> newList = list.stream().filter((Model model) -> model.getUseId() < 100 || model.getUserId > 50) .collect(Collectors.toList());
-
list集合数据截取
// 获取前3条数据 List subList = list.stream().limit(3).collect(Collectors.toList()); // 跳过前3条数据 List subList = list.stream().skip(3).collect(Collectors.toList()); // 根据下标截取数据,也可以集合分页处理 List subList = list.stream().limit(20).skip(10).collect(Collectors.toList());