问题标签 [collectors]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
199 浏览

dictionary - 使用流映射错误

我目前在弄清楚如何使用 Java 8 流时遇到了麻烦。我正在尝试从lista_dottori( Map<Integer, Doctor>) 转到一个新地图patientsPerSp,其中每个医学专业(方法getSpecialization)我映射了拥有该专业医生的患者数量(getPatients类中的方法Doctor返回List该医生的患者)。我无法理解如何为此目的使用计数方法,而且我似乎无法在互联网上找到此类问题的任何示例或解释。

这就是我写的,它确实在计数部分给了我错误:

0 投票
3 回答
16684 浏览

java - 计算 Stream 的元素

我想计算流的不同元素,想知道为什么

不起作用。日食告诉我

类型 Collectors 中的 toMap(Function, Function, BinaryOperator) 方法不适用于参数 (( s) -> {}, int, Integer::sum)

顺便说一句,我知道那个解决方案:

所以我有两个问题:

  1. 我的第一种方法有什么错误?
  2. 你将如何实现这样的计数器?

编辑:我自己解决了第一个问题:

Java 期望一个函数作为第二个参数。

0 投票
1 回答
569 浏览

java - 使用 Collectors.groupingBy() 时获取地图的值集

我有一个Collection<A>我想按其类型分组的。我可以通过getType方法获取 A 的类型。结果应该是类型Collection<Collection<A>>。例如:
输入:[A1 ,A2, A3, A1, A3, A4](A1 是“1”类型的对象,依此类推)
输出:[[A1, A1], [A2], [A3, A3], [A4]]

这是我写的: listOfAs.stream().collect(Collectors.groupingBy(SomeClass::getType)).values();

有没有一种方法可以直接获取生成的地图的值集,而不是生成地图然后使用values()?

0 投票
1 回答
16717 浏览

java - Java 8 lambdas 按多个字段分组

我有一个要对其进行分组的 pojo 列表。就像是:

我想要一个Map<String, Map<String, List<Pojo>>>键在哪里,majorCategory值是一个Map带有键的值,minorCategory值是一个对象的说。ListPojominorCategory

我打算使用 Java 8 lambdas 来实现这一点。我可以通过以下方式完成第一级分组:

我现在如何才能再次分组minorCategory并获得Map<String, Map<String, List<Pojo>>>我想要的?

更新

提供的第一个答案对于最初提供的示例是正确的,但是我已经更新了这个问题。鲁本在接受的答案中的评论提供了最后一块拼图。

0 投票
1 回答
4475 浏览

java - Java 8 lambdas 嵌套映射

我正在尝试使用 Java-8 lambdas 来解决以下问题:

给定 a List<Transaction>,对于每个,Category.minorCategory我需要Transaction.amountperCategory.minorCategory和 a MapofTransaction.accountNumber的总和以及Transaction.amountper的总和Transaction.accountNumber。根据下面的代码,我有这个工作。我现在需要分组Category.majorCategory,基本上返回一个Map<String, Map<String, MinorCategorySummary>>键控Category.majorCategory

我已经完成了所有工作,直到分组阶段,Category.majorCategory但很难找到解决方案;使用 lambda 进行编程的范式转变证明了一条陡峭的学习曲线。

TransactionBreakdown是动作发生的地方,我想返回一个Map<String, Map<String, MinorCategorySummary>>.

0 投票
2 回答
13414 浏览

java-8 - 如何使用 Java 8 Collectors groupingBy 获取带有集合 Map 的 Map?

想象一下这些课程

我有这些学科课程的列表

我想得到作为使用Collectors.groupingBy()地图首先分组Subject对象Subject.origin然后分组的结果Subject.type

结果得到这样的对象Map<String, Map<Type, List<Subject>>>

0 投票
2 回答
1538 浏览

java - Stream.skip 行为与无序终端操作

我已经阅读了这个这个问题,但仍然怀疑观察到的行为是否Stream.skip是 JDK 作者的意图。

让我们简单地输入数字 1..20:

现在让我们创建一个并行流,以不同的方式组合unordered()with并收集结果:skip()

过滤步骤在这里基本上什么都不做,但给流引擎增加了更多的困难:现在它不知道输出的确切大小,因此关闭了一些优化。我有以下结果:

结果完全没问题,一切都按预期工作。在第一种情况下,我要求跳过前两个元素,然后以不特定顺序收集到列表。在第二种情况下,我要求跳过第一个元素,然后变成无序并再跳过一个元素(我不在乎哪个元素)。在第三种情况下,我首先进入无序模式,然后跳过两个任意元素。

让我们跳过一个元素并以无序模式收集到自定义集合。我们的自定义集合将是HashSet

输出令人满意:

所以总的来说,我希望只要流是有序的,skip()就跳过第一个元素,否则它会跳过任意​​元素。

但是,让我们使用等效的无序终端操作collect(Collectors.toSet())

现在输出是:

forEach任何其他无序终端操作(如、findAnyanyMatch等)都可以实现相同的结果。在这种情况下删除unordered()步骤不会改变任何事情。似乎虽然unordered()step 正确地使流从当前操作开始无序,但无序的终端操作使整个流从一开始就无序,尽管如果skip()使用这会影响结果。这对我来说似乎完全误导:我希望使用无序收集器与在终端操作之前将流转换为无序模式并使用等效的有序收集器相同。

所以我的问题是:

  1. 这种行为是有意的还是一个错误?
  2. 如果是,它是否记录在某处?我已阅读Stream.skip()文档:它没有说明无序终端操作。此外, Characteristics.UNORDERED文档不是很容易理解,也没有说整个流的排序都会丢失。最后,包装摘要中的订购部分也不涵盖这种情况。可能我错过了什么?
  3. 如果打算无序的终端操作使整个流无序,为什么unordered()step 仅从这一点开始使其无序?我可以依靠这种行为吗?还是我很幸运,我的第一个测试运行良好?
0 投票
1 回答
125 浏览

java - Java 8 仅映射到值类型集合

我只想将 myMap <K,V>转换为Set <V>. 我在任何地方都找不到任何示例,包括此处的 Oracle 文档: https ://docs.oracle.com/javase/tutorial/collections/streams/reduction.html 我能更进一步的是:

这将返回一组Map.Entry. 在这个例子中,Map<String, String>我只希望它返回值位(字符串),我已经尝试过.collect(Collectors.toSet(HashMap::getValue)),但没有奏效。那么我在这里错过了什么?

0 投票
5 回答
44456 浏览

java - Java 8 Collectors.toMap 排序地图

我正在使用 Java 8 lambda,并希望使用它Collectors toMap来返回一个SortedMap. 我能想到的最好的方法是Collectors toMap用一个哑元mergeFunctionmapSupplier等于调用以下方法TreeMap::new

我不想传入一个合并函数,就像我想要throwingMerger()的那样,以与基本toMap实现相同的方式如下:

Collectors使用返回 a的最佳实践方法是SortedMap什么?

0 投票
0 回答
78 浏览

java - 对 Java 流执行中间排序分组操作

我有一个Stream像这样的元组对象的Java:

这些元组保证按它们的第一个元素排序。我想将此流转换为另一个元组流,如下所示:

但是,这是关键,我希望这是一个中间操作——我不需要评估第一个流的整体来输出每个组,因为元组已经按要求排序。我想要的是类似中间收集器的东西,但我在流 API 中找不到这样做的方法。

任何人都可以在不迭代整个流的情况下想出一种方法吗?