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
行为,则需要请求特定的地图
实施。例如。 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()
即可获得相应的流
。
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< String,Object> p) - > p,toList())
已过时。 p-> p
是一个身份映射,所以没有理由要求映射
:
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
作为键。 列出
的实现 hashCode
和等于
相应(但你之后不得修改这些密钥 List
。)
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屋!