是否有非终端版本groupingBy
或其他一些巧妙的方式通过生成的 Map 条目/值进行流式传输?
我发现自己想在之后流式传输这些值,groupingBy
但我能想到的最好的结果并不漂亮:
StreamEx.ofValues(
StreamEx.of(0, 1, 2, 4).groupingBy(i -> i % 2)
).mapToInt(ii -> IntStreamEx.of(ii).sum())
// RESULT: [6, 1]
是否有非终端版本groupingBy
或其他一些巧妙的方式通过生成的 Map 条目/值进行流式传输?
我发现自己想在之后流式传输这些值,groupingBy
但我能想到的最好的结果并不漂亮:
StreamEx.ofValues(
StreamEx.of(0, 1, 2, 4).groupingBy(i -> i % 2)
).mapToInt(ii -> IntStreamEx.of(ii).sum())
// RESULT: [6, 1]
在单个 Stream 管道中执行此操作可能需要所需的操作像一个完整的屏障:为了对值进行分组,我们需要对它们进行处理以查看哪些值是偶数和奇数(并能够对它们求和)。
因此,可能最好使用临时数据结构来保存偶数和奇数的计数,在这种情况下,这将是 aMap<Integer, Integer>
或偶数 a Map<Boolean, Integer>
(例如,键将true
用于偶数和false
奇数, 使用Collectors.partitioningBy
)。
请注意,您不需要在此处使用 StreamEx 库。您可以直接通过 Stream API 执行此操作:
public static void main(String[] args) {
Map<Integer, Integer> map =
Stream.of(0, 1, 2, 4)
.collect(Collectors.groupingBy(
i -> i % 2,
Collectors.summingInt(i -> i)
));
Stream<Integer> stream = map.values().stream();
}
summingInt
可能是这个特定问题的最佳解决方案。
我想我在示例中使用整数过度简化了问题。我的实际问题是关于合并对象,而不是 int 值。我发现collectingAndThen
非常有用。它是这样工作的:
Function<List<Integer>, Integer> merge = ii -> ii.stream().mapToInt(i -> i).sum();
Stream.of(0, 1, 2, 4).collect(groupingBy(i -> i % 2, collectingAndThen(toList(), merge))).values();