我有带有简单对象的列表:
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。有没有其他分组方法可以解决?
问题是groupingBy
将东西放到HashMap
中,没有确定的顺序。
例如,使用需要groupingBy
overload的groupingBy
来获得具有订购保证的地图,
Supplier<M> mapFactory
myList.stream()
.collect(groupingBy(MyObject::getUnit,
LinkedHashMap::new,
Collectors.toList()));
的Javadoc说:
对返回的Map或List对象的类型,可变性,可序列化性或线程安全性有no保证。
然后,Map接口本身不为键的顺序提供any保证!
因此:您要么必须使用另一个grouping方法(允许您强制groupingBy()或LinkedHashMap
),要么退一步,然后重新考虑整个方法。例如,您可以将列表合并后的[[sort)。