问题
我试着在Java 8流API中找到一种简单的方法来进行分组,我用这种复杂的方式出来了!
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Hello");
list.add("World");
Map<String, List<String>> collect = list.stream().collect(
Collectors.groupingBy(o -> o));
System.out.println(collect);
List<String[]> collect2 = collect
.entrySet()
.stream()
.map(e -> new String[] { e.getKey(),
String.valueOf(e.getValue().size()) })
.collect(Collectors.toList());
collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1]));
我很感激你的意见。
#1 热门回答(211 赞)
我想你只是在找3888255664,需要另外Collector
来指定如何处理每个组......然后在Collectors.counting()
进行计数:
import java.util.*;
import java.util.stream.*;
class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Hello");
list.add("World");
Map<String, Long> counted = list.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(counted);
}
}
结果:
{Hello=2, World=1}
(还有可能使用groupingByConcurrent
提高效率。如果在你的上下文中安全,请记住你的真实代码。)
#2 热门回答(4 赞)
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Hello");
list.add("World");
Map<String, List<String>> collect = list.stream().collect(
Collectors.groupingBy(o -> o));
System.out.println(collect);
collect.entrySet().forEach(e -> System.out.println(e.getKey() + " >> " + e.getValue().size()));
#3 热门回答(3 赞)
这是StreamEx的简单解决方案
StreamEx.of(list).groupingBy(Function.identity(), Collectors.countingInt());
减少样板代码:collect(Collectors.