首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流groupingBy值

流groupingBy值
EN

Stack Overflow用户
提问于 2016-02-09 11:10:19
回答 2查看 978关注 0票数 2

是否有一个非终端版本的groupingBy或其他一些简洁的方式来流的结果地图条目/值?

我发现自己想在groupingBy之后不断地浏览这些值,但是我所能想到的最好的方法并不是很好:

代码语言:javascript
复制
    StreamEx.ofValues(
            StreamEx.of(0, 1, 2, 4).groupingBy(i -> i % 2)
    ).mapToInt(ii -> IntStreamEx.of(ii).sum())
    // RESULT: [6, 1]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-09 11:25:42

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

因此,最好使用临时数据结构来保存偶数值和奇数值的计数,在这种情况下,这将是一个Map<Integer, Integer>或偶数Map<Boolean, Integer> (例如,关键是偶数值的true,奇值的false,使用Collectors.partitioningBy)。

请注意,这里不需要使用StreamEx库。您可以直接这样做-- Stream:

代码语言:javascript
复制
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();
}
票数 2
EN

Stack Overflow用户

发布于 2016-02-09 14:38:41

对于这个特定问题,summingInt可能是最好的解决方案。

我想我在我的例子中使用了ints来过度简化这个问题。我的实际问题是合并对象,而不是int值。我发现collectingAndThen非常有用。它的工作方式如下:

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35290487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档