【发布时间】:2021-12-05 02:04:19
【问题描述】:
我有一个Person 对象的列表,我想在列表中找到最常见的名称和频率,仅使用 java 流。 (平局时,返回任意结果)
目前,我的解决方案使用groupingBy 和counting,然后再次在结果映射中找到max 元素。
当前的解决方案在输入(列表/地图)上进行 2 次传递。
是否有可能使它更高效和可读?
Person p1 = Person.builder().id("p1").name("Alice").age(1).build();
Person p2 = Person.builder().id("p2").name("Bob").age(2).build();
Person p3 = Person.builder().id("p3").name("Charlie").age(3).build();
Person p4 = Person.builder().id("p4").name("Alice").age(4).build();
List<Person> people = ImmutableList.of(p1, p2, p3, p4);
Map.Entry<String, Long> mostCommonName = people
.stream()
.collect(collectingAndThen(groupingBy(Person::getName, counting()),
map -> map.entrySet().stream().max(Map.Entry.comparingByValue()).orElse(null)
));
System.out.println(mostCommonName); // Alice=2
【问题讨论】:
-
假设列表中有 2x Alice 和 2x Tom。你想同时得到这两个名字,只有 Alice,只有 Tom,或者只要它是一个重复次数最多的名字,哪一个都没有关系?
标签: java collections java-stream