我有一个字符串列表,我想在文件中写入不同的字符串集,并将其转换为 UUID 并将其存储为另一个变量。Java 8 lambda 是否有可能以及如何实现?
我要求两个收集器的原因是避免将其运行到第二个循环中。
我有一个字符串列表,我想在文件中写入不同的字符串集,并将其转换为 UUID 并将其存储为另一个变量。Java 8 lambda 是否有可能以及如何实现?
我要求两个收集器的原因是避免将其运行到第二个循环中。
这在Java 12中是可能的,它引入了Collectors.teeing
:
public static <T, R1, R2, R>
Collector<T, ?, R> teeing(Collector<? super T, ?, R1> downstream1,
Collector<? super T, ?, R2> downstream2,
BiFunction<? super R1, ? super R2, R> merger);
返回一个由两个下游收集器组合而成的收集器。传递给结果收集器的每个元素都由两个下游收集器处理,然后使用指定的合并函数将它们的结果合并到最终结果中。
例子:
Entry<Long, Long> entry = Stream
.of(1, 2, 3, 4, 5)
.collect(teeing(
filtering(i -> i % 2 != 0, counting()),
counting(),
Map::entry));
System.out.println("Odd count: " + entry.getKey());
System.out.println("Total count: " + entry.getValue());
正如@Holger 所指出的,我写了一个配对收集器来回答另一个聚合两个收集器的问题。这样的收集器现在在我的StreamEx库中很容易获得:MoreCollectors.pairing
. jOOL 库中也有类似的收集器。