Java 流按值分组

Java 流按值分组,java,java-stream,streamex,Java,Java Stream,Streamex,是否有非终端版本的groupingBy或其他整洁的方式来流式处理生成的地图条目/值 我发现自己想通过groupingBy之后的值进行流式处理,但我能想到的最好方法是: StreamEx.ofValues( StreamEx.of(0, 1, 2, 4).groupingBy(i -> i % 2) ).mapToInt(ii -> IntStreamEx.of(ii).sum()) // RESULT: [6, 1] 在单流管道中执行

是否有非终端版本的
groupingBy
或其他整洁的方式来流式处理生成的地图条目/值

我发现自己想通过
groupingBy
之后的值进行流式处理,但我能想到的最好方法是:

    StreamEx.ofValues(
            StreamEx.of(0, 1, 2, 4).groupingBy(i -> i % 2)
    ).mapToInt(ii -> IntStreamEx.of(ii).sum())
    // RESULT: [6, 1]

在单流管道中执行此操作可能需要所需的操作像一个完整的屏障:为了对值进行分组,我们需要对所有值进行处理,以查看哪些值是偶数和奇数(并能够对它们求和)

因此,可能最好使用临时数据结构来保存偶数和奇数值的计数,在这种情况下,这将是
映射
或偶数
映射
(其中,例如,使用
收集器,对于偶数值,键将是
true
,对于奇数值,键将是
false


请注意,此处不需要使用StreamEx库。您可以通过流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();
}
publicstaticvoidmain(字符串[]args){
地图=
(0,1,2,4)流
.collect(收集器.groupingBy(
我->我%2,
收集器.汇总(i->i)
));
Stream=map.values().Stream();
}

summingit
可能是这个特定问题的最佳解决方案

我想我在我的示例中使用int过于简化了这个问题。我的实际问题是合并对象,而不是int值。我发现
收集然后
非常有用。它的工作原理如下:

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();
函数merge=ii->ii.stream().mapToInt(i->i.sum();
(0,1,2,4)的Stream.of.collect(groupingBy(i->i%2,collectingAndThen(toList(),merge)).values();