我正在使用预定义的MyComparator对流中填充的MyObject(该对象有一个getName()getter)进行排序。
那么一旦排序,是否有一种方法将MyObject的名称和排序后对象的顺序/位置收集到映射中?
下面是我认为应该是的样子:
Set<MyObject> mySet; // Already populated mySet
Map<String, Integer> nameMap = mySet.stream()
.sorted(myComparator)
.collect(Collectors.toMap(MyObject::getName, //HowToGetThePositionOfTheObjectInTheStream));
例如,如果集合包含三个对象(名称为name1的object1,名称为name2的object2,名称为name3的object3),并且在对它们进行排序的流中,如何获得如下所示的结果映射:
name1, 1
name2, 2
name3, 3
多谢了。
Javastream
不公开元素的任何索引或定位,所以我不知道用streams magic替换/*HowtoGetthePositionoftheObjectintheStream*/
以获得所需的数字。
相反,一种简单的方法是收集到list
,它为每个元素提供索引。它是从零开始的,所以在转换为映射时,加1。
List<String> inOrder = mySet.stream()
.sorted(myComparator)
.map(MyObject::getName)
.collect(Collectors.toList());
Map<String, Integer> nameMap = new HashMap<>();
for (int i = 0; i < inOrder.size(); i++) {
nameMap.put(inOrder.get(i), i + 1);
}
问题内容: 在上面的代码中,我可以期望中的名称顺序始终与中的顺序相同吗? 问题答案: 是的,只要您没有将并行流显式转换为模式,即使您正在使用并行流,也可以期望这样做。 顺序永远不会在顺序模式下更改,但可能会在并行模式下更改。流变得无序: 如果您通过调用将其明确转换为无序模式 如果流源报告它是无序的(例如,流是无序的,因为顺序取决于实现,因此您不能依赖它) 如果您使用的是无序终端操作(例如,进行操作
我有这个代码: 它产生的是 很高兴我应该如何写映射方法来得到一个地图,它会给我:
我有一个问题,希望有人能帮助我提高Java流API的知识。 我的服务通过RabbitMQ以如下数组的形式从另一个服务接收数据: 我需要对这些数据做的是将其收集到用户具有userId的列表和设备id的列表中。因此,从上面的数据来看,它应该是: 我确实有一个可行的解决方案,但它很笨拙 解决方案是: 如何对流执行相同的操作?谢谢
我试图使用JDK 8风格的函数按值对地图进行排序。虽然我得到了排序部分,但我不确定如何在树形图中收集结果。有人能解释一下如何以陈述式的方式完成这项工作吗? 我需要收集另一张