Java 8 在分组时不保持顺序 [英] Java 8 is not maintaining the order while grouping
问题描述
我正在使用 Java 8 按数据分组.但是得到的结果并不是按顺序形成的.
I m using Java 8 for grouping by data. But results obtained are not in order formed.
Map<GroupingKey, List<Object>> groupedResult = null;
if (!CollectionUtils.isEmpty(groupByColumns)) {
Map<String, Object> mapArr[] = new LinkedHashMap[mapList.size()];
if (!CollectionUtils.isEmpty(mapList)) {
int count = 0;
for (LinkedHashMap<String, Object> map : mapList) {
mapArr[count++] = map;
}
}
Stream<Map<String, Object>> people = Stream.of(mapArr);
groupedResult = people
.collect(Collectors.groupingBy(p -> new GroupingKey(p, groupByColumns), Collectors.mapping((Map<String, Object> p) -> p, toList())));
public static class GroupingKey
public GroupingKey(Map<String, Object> map, List<String> cols) {
keys = new ArrayList<>();
for (String col : cols) {
keys.add(map.get(col));
}
}
// Add appropriate isEqual() ... you IDE should generate this
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final GroupingKey other = (GroupingKey) obj;
if (!Objects.equals(this.keys, other.keys)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 7;
hash = 37 * hash + Objects.hashCode(this.keys);
return hash;
}
@Override
public String toString() {
return keys + "";
}
public ArrayList<Object> getKeys() {
return keys;
}
public void setKeys(ArrayList<Object> keys) {
this.keys = keys;
}
}
我在这里使用我的类 groupingKey,我通过它动态地从 ux 传递.如何以排序形式获取此 groupByColumns?
Here i am using my class groupingKey by which i m dynamically passing from ux. How can get this groupByColumns in sorted form?
推荐答案
不维护顺序是存储结果的 Map
的一个属性.如果您需要特定的 Map
行为,则需要 请求一个特定的Map
实现.例如.LinkedHashMap
维护插入顺序:
Not maintaining the order is a property of the Map
that stores the result. If you need a specific Map
behavior, you need to request a particular Map
implementation. E.g. LinkedHashMap
maintains the insertion order:
groupedResult = people.collect(Collectors.groupingBy(
p -> new GroupingKey(p, groupByColumns),
LinkedHashMap::new,
Collectors.mapping((Map<String, Object> p) -> p, toList())));
<小时>
顺便说一句,在创建 Stream
之前,没有理由将 mapList
的内容复制到数组中.您可以简单地调用 mapList.stream()
来获得合适的 Stream
.
By the way, there is no reason to copy the contents of mapList
into an array before creating the Stream
. You may simply call mapList.stream()
to get an appropriate Stream
.
此外,Collectors.mapping((Map
已过时.p->p
是一个身份映射,所以根本没有理由请求 mapping
:
Further, Collectors.mapping((Map<String, Object> p) -> p, toList())
is obsolete. p->p
is an identity mapping, so there’s no reason to request mapping
at all:
groupedResult = mapList.stream().collect(Collectors.groupingBy(
p -> new GroupingKey(p, groupByColumns), LinkedHashMap::new, toList()));
<小时>
但即使是 GroupingKey
也已过时.它基本上包装了一个 List
值,所以你可以首先使用一个 List
作为键.List
适当地实现 hashCode
和 equals
(但您不得修改这些键 List
s 之后).
But even the GroupingKey
is obsolete. It basically wraps a List
of values, so you could just use a List
as key in the first place. List
s implement hashCode
and equals
appropriately (but you must not modify these key List
s afterwards).
Map<List<Object>, List<Object>> groupedResult=
mapList.stream().collect(Collectors.groupingBy(
p -> groupByColumns.stream().map(p::get).collect(toList()),
LinkedHashMap::new, toList()));
这篇关于Java 8 在分组时不保持顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!