Java groupingBy总是在改变顺序

问题描述 投票:0回答:2

我有带有简单对象的列表:

private String unit;
private Double value;

列表看起来像这样:

f, 1.0;
ml, 15.0;
g, 9.0

我创建了一个简单的函数,在这里我想将这些值分组并以unit为键将它们放在地图上,并将对象列表作为值,但是我想像在原始列表中那样保存顺序。这是我目前的解决方案:

myList.stream()
    .collect(groupingBy(MyObject::getUnit));

但是此后,我的地图按字母顺序排序:f,g,ml代替f,ml,g。有没有其他分组方法可以解决?

java list java-stream grouping collectors
2个回答
8
投票

问题是groupingBy将东西放到HashMap中,没有确定的顺序。

例如,使用需要groupingBy overloadgroupingBy来获得具有订购保证的地图,

Supplier<M> mapFactory

1
投票

myList.stream() .collect(groupingBy(MyObject::getUnit, LinkedHashMap::new, Collectors.toList())); 的Javadoc说:

对返回的Map或List对象的类型,可变性,可序列化性或线程安全性有no保证。

然后,Map接口本身不为键的顺序提供any保证!

因此:您要么必须使用另一个grouping方法(允许您强制groupingBy()LinkedHashMap),要么退一步,然后重新考虑整个方法。例如,您可以将列表合并后的[[sort)。

© www.soinside.com 2019 - 2024. All rights reserved.