())) { user.setUserInfo(userInfo); } }); }).collect(Collectors.toList map,key为userId,value为userInfo Map<String, UserInfo> userInfoMap = userInfoList.stream().collect(Collectors.toMap user -> { //直接赋值 user.setUserInfo(userInfoMap.get(user.getId())); }).collect(Collectors.toList
Collectors 与集合转换Collectors.toList streamArr.collect(Collectors.toList());List<Integer> collectList = (p -> p.age, Collectors.mapping((Person p) -> p.name, Collectors.toList())));//mapping即为对各组进行投影操作,和Stream = peoples.stream().collect(Collectors.groupingBy(p -> p.name, Collectors.summingInt((Person p) -> p.age joining 拼接字符串Collectors.joining 收集Stream中的值,该方法可以方便地将Stream得到一个字符串。 .collect(Collectors.averagingInt(p -> p.age)); System.out.println(averageAge); // 19.0Collectors.SummaryStatistics
super U> downstreamAccumulator = downstream.accumulator(); return new Collectors.CollectorImpl<>( downstream.characteristics()); } 用法: List<Integer> actual = Stream.iterate(0, i -> ++i).limit(3) .collect(Collectors.flatMapping (i -> Stream.of(i, i), Collectors.toList())); Assertions.assertEquals(Arrays.asList(0, 0, 1, 1, 2, 2)
今天发现了Collectors.mapping的正确姿势 使用场景如下: 我想要对一个List<User>进行groupBy class User { private String (User::getAge)); 实际上,我只需要此处User的name,我希望得到的是一个List<age,List<name>>这样结构的数据 这时候,Collectors.mapping就出现啦! Map<Integer, List<String>> ageNamesMap = users.stream().collect(Collectors.groupingBy(User::getAge, Collectors.mapping (User::getName, Collectors.toList()))); 这里使用了 Collectors.groupingBy(Function<? (User::getName, Collectors.toList()) 可以在分组后再获取其中属性,或者还可以进行别的计算如分组后再根据每一组内获取最大值等
Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组 @Data public class Student { private String name; private student3, student4, student5); Map<Object, List<Student>> newList = studentList.stream().collect(Collectors.groupingBy student3, student4, student5); Map<Object, List<Student>> newList = studentList.stream().collect(Collectors.groupingBy newList.toString()); } 另外一个用法就是判断入参数组里面是否有重复数据 这个时候就可以用 long distinctCount = studentList.stream().collect(Collectors.groupingBy
概述 Collectors是一个公共final 类,它扩展了Object 类。Collectors 类提供了各种有用的归约操作,例如将元素累积到集合中,根据各种标准汇总元素等。 此外java.util.stream.Collectors还提供了快捷的求平均数的三个方法: funs.stream().map(FunTester::getAge).collect(Collectors.averagingDouble funs.stream().map(FunTester::getAge).collect(Collectors.counting()); Collectors.joining() 示例 Collectors.joining ,"[","]")); 控制台输出: INFO-> main [机器人,机器人,背锅侠,BUG君,菜鸟] Collectors.groupingBy() 示例 Collectors.groupingBy Collectors.partitioningBy() 示例 Collectors.partitioningBy()这个是根据判断条件分组,判断条件就是传入的参数。
一、Collectors.toList() 现在有个集合: List<User> users = getUserList(); 现在需要将这些user的id提取出来。 ()); System.out.println(results); //{A, B, C, D} 二、Collectors.toMap() Collectors.toMap(),一般用于将一个List 常见用法: list.stream().collect(Collectors.toMap(Function keyMapper, Function valueMapper)) 可以接收2个、 (User::getId, p -> p)); Map<Long, User> map = userList.stream().collect(Collectors.toMap(User::getId 当你想获取key是age的map,又不想覆盖掉重复项数据,这个时候就可以用 Collectors.groupingBy 了。
但 Collectors 实用类提供了很多静态工厂方法,可以方便地创建常见收集器的实例,只要拿来用就可以了。 最直接和最常用的收集器是 toList静态方法,它会把流中所有的元素收集到一个 List 中: List<Transaction> transactions = transactionStream.collect(Collectors.toList ()); ---- 预定义收集器 预定义收集器的功能,也就是那些可以从 Collectors类提供的工厂方法(例如 groupingBy )创建的收集器。
= Arrays.asList("a", "bb", "cc", "ddd"); Map<Integer, List<String>> result = list.stream().collect(Collectors.groupingBy setGoodsCd("A003"); list.add(entity3); Map<String, List<ExcelEntity>> map = list.stream() .collect(Collectors.groupingBy 448139f0], 003=[com.ExcelEntity@7cca494b]} 3.计数 Map<String, Long> map = list.stream() .collect(Collectors.groupingBy (ExcelEntity::getGlobalNo, Collectors.counting())); System.out.println(map); // {001=1, 002=1, 003=2}
—— 鲁迅 对于Collectors.toMap,我们使用时如果value为空,则会抛出空指针,因为底层调用的Map.merge函数 如果我们想避免该问题,就可以使用collect去处理,例如我给hutool 提交的这个PR一样 原先: StreamUtil.of(collection, isParallel).collect(Collectors.toMap(key, value, (l, r) -> l) ); } 当然,对于hutool中另一个函数CollStream.toIdentityMap也同理 原来: StreamUtil.of(collection, isParallel).collect(Collectors.toMap
在这篇文章中,我们将向您展示如何使用java 8 Stream Collectors 对列表分组,计数,求和和排序。 1. ( Function.identity(), Collectors.counting() ) ); System.out.println(result); } } output { papaya=1, ().collect( Collectors.groupingBy(Item::getName, Collectors.summingInt(Item::getQty))); System.out.println and Collectors.mapping例子. (Item::getPrice, Collectors.mapping(Item::getName, Collectors.toSet()) ) ); System.out.println(result
于是java提供了更简单的Collectors工具类来方便我们构建Collector。 下面我们将会具体讲解Collectors的用法。 接下来的例子我们会用上面的两个list来讲解Collectors的用法。 Collectors.toList() List<String> listResult = list.stream().collect(Collectors.toList()); log.info Collectors.toSet() Set<String> setResult = list.stream().collect(Collectors.toSet()); log.info 总结 Collectors是一个非常强大的工具类,希望大家能够灵活使用。
前言 昨天在 Collection 移除元素操作[1] 相关的文章中提到了 Collectors 。相信很多同学对这个比较感兴趣,那我们今天就来研究一下 Collectors 。 2. Collectors 的作用 Collectors 是 Java 8 加入的操作类,位于 java.util.stream 包下。 Java 8 中 Collectors 的方法 Collectors 提供了一系列的静态方法供我们使用,通常情况我们静态导入即可使用。接下来我们来看看都提供了哪些方法吧。 Collectors.toList(); Collectors.toMap(); Collectors.toSet(); Collectors.toCollection(); 总结 今天我们对 Java 8 中的 Collectors 进行了详细的讲解。如果你熟悉了 Collectors 操作 Stream 会更加得心应手。
按照常规思维,往一个map里put一个已经存在的key,会把原有的key对应的value值覆盖,然而通过一次线上问题,发现Java8中的Collectors.toMap反其道而行之,它默认给抛异常,抛异常 线上业务代码出现Duplicate Key的异常,影响了业务逻辑,查看抛出异常部分的代码,类似以下写法: 1 Map<Integer, String> map = list.stream().collect(Collectors.toMap 如果不想抛异常的话,自己传进去一个方法即可,上述代码可以改成: 1 Map<Integer, String> map = list.stream().collect(Collectors.toMap(Person
List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6); integers.stream().map(x -> x*x).collect(Collectors.toList List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6); integers.stream().map(x -> x*x).collect(Collectors.toSet (Comparator.naturalOrder())) .get(); // output: 1 strings .stream() .collect(Collectors.minBy (Comparator.reverseOrder())) .get(); // output: 6 strings .stream() .collect(Collectors.minBy (String::length, Collectors.toCollection(LinkedList::new))); // output: {4=[beta, beta
解决办法: 因为Collectors.groupingBy分组后默认返回HashMap类型,我们修改为LinkedHashMap即可。 Collectors.groupingBy部分源码: //一个参数 classifier public static <T, K> Collector<T, ? .stream() .sorted(Comparator.comparing(ProcessDetails::getBeginTime)) .collect(Collectors.groupingBy (ProcessDetails::getGroupBy,LinkedHashMap::new,Collectors.toList())); 以上就是Collectors.groupingBy分组后乱序问题的全部内容
BinaryOperator combiner(); Function<A, R> finisher(); Set<Characteristics> characteristics(); } Collectors
上面提到的小功能就是 Collectors.teeing API, 先来看一下 JDK 关于该 API 的说明,看着觉得难受的直接忽略,继续向下看例子就好了: /** * Returns a {@code Collector} that is a composite of two downstream collectors. * Every element passed to the resulting ( Collectors.filtering(Guest::isParticipating, Collectors.mapping(Guest::getName , Collectors.toList())), Collectors.summingInt(Guest::getParticipantsNumber), 灵魂追问 Collectors 里面的静态方法你应用的熟练吗? 项目中你们在用 JDK 的版本是多少? Lambda 的使用熟练吗? 你的灯还亮着吗? ---- ?
(Collectors.averagingInt(Dish::getCalories), a -> "The Average Calories is->" + a))) (Dish::getType, Collectors.averagingInt(Dish::getCalories)))) .ifPresent(System.out:: (Dish::getType, Collectors.averagingInt(Dish::getCalories))); Optional.ofNullable(collect).ifPresent (Dish::getName, Collectors.joining(",")))) .ifPresent(System.out::println); } (Dish::isVegetarian, Collectors.averagingInt(Dish::getCalories))); Optional.of(collect).ifPresent
我们在使用toMap时如果遇到null元素,经常会导致我们发生npe 很不方便 于是我给hutool提交了一个PR 完美解决了这个问题 使用方式: 升级到hutool-5.7.20 然后使用CollectorUtil Map<String, Integer> collect = Arrays.asList("ruben", "a chao", "vampire", "RUBEN", "VAMPIRE", null).stream().collect(CollectorUtil.toMap(Function.