我不熟悉 bson,所以我尝试获取名称流,分数条目是这样的:
List<org.bson.Document> ldoc = new ArrayList<>();
Stream<Entry<String, Integer>> s
= ldoc.stream()
.flatMap(d -> d.entrySet().stream())
.map(e -> new AbstractMap.SimpleImmutableEntry<String,Integer>(e.getKey(),((Integer)e.getValue())));
我直接从列表中创建了 Stream。
List<Entry<String, Integer>> l = new ArrayList<>();
l.add(new AbstractMap.SimpleImmutableEntry<>("Joe", 72));
l.add(new AbstractMap.SimpleImmutableEntry<>("Joe", 66));
l.add(new AbstractMap.SimpleImmutableEntry<>("John", 73));
l.add(new AbstractMap.SimpleImmutableEntry<>("John", 86));
l.add(new AbstractMap.SimpleImmutableEntry<>("John", 99));
可以像这样在同一个流中分组和最小化:
Map<String, Optional<Integer>> m = l.stream()
.collect(Collectors.groupingBy(e -> e.getKey(),
Collectors.mapping(e -> e.getValue(),
Collectors.minBy((i1, i2) -> Integer.compare(i1, i2)))));
System.out.println("m = " + m);
这会产生输出:
m = {Joe=Optional[66], John=Optional[73]}
也就是说这是每个玩家名字最低分的地图。
要获得胜利者:
String winner = m.entrySet()
.stream()
.min((e1, e2) -> Integer.compare(e1.getValue().get(), e2.getValue().get()))
.get().getKey();
System.out.println("winner = " + winner);
哪些打印:
winner = Joe