Java8计数收集器附加信息

Ano*_*oop 4 java java-8 collectors

我正在使用java 8的计数收集器来获取有关值计数的信息.

对于前 如果我有一堆像溪流一样

Stream<String> doc1 = Stream.of("a", "b", "c", "b", "c");
Stream<String> doc2 = Stream.of("b", "c", "d");
Stream<Stream<String>> docs = Stream.of(doc1, doc2);
Run Code Online (Sandbox Code Playgroud)

我可以通过执行来计算文档中每个单词的出现次数

List<Map<String, Long>> collect = docs
    .map(doc -> doc.collect(Collectors.groupingBy(Function.identity(), Collectors.counting())))
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

这导致结构为

[
{a=1, b=2, c=2}, 
{b=1, c=1, d=1}
]
Run Code Online (Sandbox Code Playgroud)

但是,我希望将计数与源自它的docId相关联.例如,我希望有一个结构

[
{a=(randId1, 1), b=(randId1, 2), c=(randId1, 2)}, 
{b=(randId2, 1), c=(randId2, 1), d=(randId2, 1)}
]
Run Code Online (Sandbox Code Playgroud)

在那里randId1,并randId2可以在运行时产生的(我只是需要一种方法来追溯的唯一来源),并()表示 Apache的类.

我曾尝试来包装文档中Pair(docId, doc),但我被困在修改Collectors.counting()替换

List<Map<String, Long>> collect = docs.map(doc -> Pair.of(UUID.randomUUID(), doc))
    .map(p -> p.getRight().collect(Collectors.groupingBy(Function.identity(), Collectors.counting())))
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

如何获得所需格式的输出?

Eug*_*ene 5

这不是很可读......我已经替换了Pair,AbstractMap.SimpleEntry因为它做了同样的事情,我已经在我的类路径上了.

 List<Map<String, AbstractMap.SimpleEntry<Long, UUID>>> result = docs.map(doc -> doc.collect(Collectors.collectingAndThen(
            Collectors.groupingBy(Function.identity(), Collectors.counting()),
            map -> {
                UUID rand = UUID.randomUUID();
                return map.entrySet().stream().collect(Collectors.toMap(
                        Entry::getKey,
                        e -> new AbstractMap.SimpleEntry<>(e.getValue(), rand)));
            })))
            .collect(Collectors.toList());

    System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

而这个的输出:

[{a=1=890d7276-efb7-41cc-bda7-f2dd2859e740, 
  b=2=890d7276-efb7-41cc-bda7-f2dd2859e740, 
  c=2=890d7276-efb7-41cc-bda7-f2dd2859e740}, 

 {b=1=888d78a5-0dea-4cb2-8686-c06c784d4c66, 
  c=1=888d78a5-0dea-4cb2-8686-c06c784d4c66, 
  d=1=888d78a5-0dea-4cb2-8686-c06c784d4c66}]
Run Code Online (Sandbox Code Playgroud)