假设我有一个成对对象的列表,
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集。
(我知道,仅仅因为我可以一步完成,并不意味着我应该这样做,因为可读性可能会受到影响,但我很好奇。)
谢谢!
您可以使用Map.computeIfAbent
:
Map<A, Set<B>> finalResult = new HashMap<>();
listOfPairs.forEach(pair -> finalResult.computeIfAbsent(
pair.getLeft(),
k -> new HashSet<>())
.add(pair.getRight()));
如果要保留插入顺序,可以分别使用LinkedHashMap
和LinkedHashSet
而不是HashMap
和HashSet
。
您可以通过将映射
收集器传递到分组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
问题内容: 我大约提高了一些代码,以前也问了一个问题在这里。@霍尔格给了我正确的回答,他说: 每当发现自己通过groupingBy使用reducer收集器时,都应检查toMap是否更合适 好像是花样!他建议我做的只是完美的。 这是众所周知的模式吗?为什么比(在某些情况下)结合和更好? 问题答案: 通过使用两个收集器的经验,这种模式变得显而易见。您会在Stackoverflow上找到一些问题和解答,