当前位置: 首页 > 知识库问答 >
问题:

流按值分组

安高翰
2023-03-14

有没有非终端版本的groupingBy或其他一些简洁的方式来流式传输生成的Map条目/值?

我发现自己想在分组后流过值By,但我能想到的最好的方法并不漂亮:

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

共有2个答案

莫泓
2023-03-14

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

我想我在我的例子中使用了int,把这个问题简单化了。我的实际问题是合并对象,而不是合并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();
凌和颂
2023-03-14

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

因此,最好使用临时数据结构来保存偶数和奇数值的计数,在这种情况下,这将是一个Map

注意,这里不需要使用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();
}

 类似资料:
  • 问题内容: 给定这样的假设查询: 并有一个类似于下面的表格: 所需结果: 有什么方法可以使用GROUP BY和LIKE语句(LIKE“ silver”,LIKE“ gold”,LIKE“ platinum”等)对这些条目进行分组? 问题答案: 您可以使用: 某些数据库允许您在中使用列别名。

  • 问题内容: 我尝试在Java 8流API中找到一种简单的方法来进行分组,我提出了这种复杂的方法! 感谢你的投入。 问题答案: 我认为你只是在寻找过载,它需要另一个负载来指定对每个组执行的操作…然后进行计数: 结果: (也有可能使用来提高效率。如果在你的上下文中安全的话,请记住你的真实代码。)

  • 这将产生以下结果 我所感兴趣的实际上只是上面结果中的列表,我希望理想地将其作为groupby操作的一部分来完成。我知道这是可以做到的,例如,通过循环结果映射结构。但是有没有一种方法可以使用流来实现它呢?

  • 问题内容: 经过一些帮助MSChart-强制从Origin绘制折线图]后,我设法将以下MSSQL查询放在一起,以用于折线图。 但是,我有一个问题。该查询返回类似以下内容的内容: 这意味着我每天都在阅读,而实际上每个不同的值仅需要一行。在每种情况下,我都希望它第一次出现,因此对于上面的示例,我希望查询返回: 我看了看似是基于类似前提的几个问题,但是所有答复都是针对特定情况而量身定制的(有些甚至使用L

  • 问题内容: 假设我有一个这样的列表: 我如何最优雅地将其分组以在Python中获得此列表输出: 因此,这些值按次值分组,但顺序保留下来。 问题答案:

  • 问题内容: 我有一个数据库: 我想选择所有条目,但有一个例外: 与的所有条目均应分组 *与的 *最后一个条目应在之后 这是我期望的结果: 到目前为止,我已经做到了这一点(注意:“ change_count” = COUNT): 那就是我得到的: 如您所见,结果有两个问题: 条目按首次出现分组(应为last(最新)) 也被分组(不应该被分组) 我上面描述的任务可以实现吗?我该怎么做? 编辑: 问题答