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

Java8 Lambda(分组和减少在一个单一的步骤)

厉念
2023-03-14

假设我有一个成对对象的列表,

List<Pair<A,B>> listOfPairs = //some list of pairs ; 

我想把这个列表分组成一张地图

目前,我可以分两步完成。第一步按A分组,并返回映射

   Map<A,Set<Pair<A,B>> intermediateStep =   listOfPairs.stream().collect(Collectors.groupingBy((Pair::getLeft), Collectors.toSet()));

然后,我对上面映射的入口集进行流式处理,并将它们收集到所需的最终结果中,主要是通过将每个Pair对象映射到其B值,然后将它们收集到一个集合:

 Map<A, Set<B>> finalResult= intermediateStep.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().stream().map(Pair::getRight).collect(Collectors.toSet())));

有没有更好的方法,也许一步就能达到预期的效果?换句话说,上面提到的中间步骤按A分组,但分组的右侧返回整个Pair对象。我想按A分组,并在一个步骤中指向其关联的B集。

(我知道,仅仅因为我可以一步完成,并不意味着我应该这样做,因为可读性可能会受到影响,但我很好奇。)

谢谢!


共有2个答案

金成济
2023-03-14

您可以使用Map.computeIfAbent

Map<A, Set<B>> finalResult = new HashMap<>();
listOfPairs.forEach(pair -> finalResult.computeIfAbsent(
        pair.getLeft(), 
        k -> new HashSet<>())
    .add(pair.getRight()));

如果要保留插入顺序,可以分别使用LinkedHashMapLinkedHashSet而不是HashMapHashSet

年凯康
2023-03-14

您可以通过将映射收集器传递到分组By收集器来简化代码,如下所示:

Map<A, Set<B>> collect = 
       listOfPairs.stream()
                  .collect(Collectors.groupingBy(Pair::getLeft, 
                                Collectors.mapping(Pair::getRight,
                                       Collectors.toSet())));
 类似资料:
  • 这是我的问题,我需要创建一个运行以下指令的程序。 创建名为Fraction的java类。此类用于表示两个整数的比率。包括允许用户设置分子和分母的mutator方法。还包括一种在屏幕上以定量显示分数的方法(例如5/9)。这种方法不需要将分数减少到最低项。 分数类应包含以下内容: 用于存储分子、分母和ratio\u值的私有实例变量 创建一个测试程序,允许用户创建7个分数的数组。然后程序将按升序对分数进

  • 我试图减少一个双精度字符的数量。我如何减少这一点: 到 这是斯威夫特的吗?

  • 以下是我所做的: 我的意见如下: 这意味着什么无关紧要,但扫描仪所做的是首先将其存储在字符串“按原样”中。然后,我使用 replaceAll 函数删除所有空格。然后我剩下: 然后,我使用java解释这段代码,如果没有错误发生,就执行计算。我现在的问题是,当我把字符串分割成记号时,它将使每个“减号”成为它自己的记号,但我想以某种方式把它和它后面的整数联系起来,这样记号仍然只是一个整数(现在是负的),

  • 问题内容: 我有一个看起来像这样的表: 并且我想计算出上一日期的column的增加/减少百分比。例如,结果将是这样的, 我已经搜寻并绞尽脑汁了几天。通常,我只是使用服务器端代码来完成此操作,但是现在我需要将其全部包含在查询中。 问题答案: 试试这个:

  • 在调试和故障处理的时候,我们通常有必要知道 RDD 有多少个分区。这里有几个方法可以找到这些信息: 使用 UI 查看在分区上执行的任务数 当 stage 执行的时候,你可以在 Spark UI 上看到这个 stage 上的分区数。 下面的例子中的简单任务在 4 个分区上创建了共 100 个元素的 RDD ,然后在这些元素被收集到 driver 之前分发一个 map 任务: scala> val s

  • 问题内容: 朋友你好,我试图显示我的Jave Gui应用程序中的记录,我做了一些代码,但是当我单击下一步按钮时,它显示了最后一条记录。还有什么其他方法可以查看之间的记录,请帮忙。 问题答案: 您需要将数据库代码与GUI代码分开。您还需要将您的应用程序分解为更小的,更容易编码的步骤。 这是您的应用程序在启动时需要做的事情: 打开与数据库的连接。 选择表Soil_det的所有键,然后将键保存在列表中。