我有一个词流,我想根据相同元素的出现对它们进行排序(= words )。
例如:{你好,世界,你好}
至
Map<String, List<String>>你好,{hello,hello}
世界,{世界}
到目前为止我所拥有的是:
Map<Object, List<String>> list = streamofWords.collect(Collectors.groupingBy(???));问题1:流似乎丢失了他正在处理String的信息,因此编译器迫使我将类型更改为Object,List
问题2:我不知道该把什么放在亲子里,按照同样的情况来分组。我知道我能够处理lambda表达式中的单个元素,但是我不知道如何到达“外部”每个元素来检查是否相等。
谢谢
发布于 2015-04-29 14:45:33
您正在搜索的KeyExtractor是identity函数:
Map<String, List<String>> list = streamofWords.collect(Collectors.groupingBy(Function.identity()));编辑补充说明:
Function.identity()用一个只返回它得到的参数的方法来复述一个‘函数’。Collectors.groupingBy(Function<S, K> keyExtractor)提供一个收集器,它将流的所有元素收集到一个Map<K, List<S>>中。它使用keyExtractor实现来检查流的S类型的对象,并从中推断出K类型的键。此键是映射的键,用于获取(或创建)添加流元素的结果映射中的列表。发布于 2018-11-21 10:45:34
如果您想按对象的某些字段(而不是整个对象)进行分组,并且不想更改等于和hashCode方法,那么我将创建一个包含一组键的类,用于分组:
import java.util.Arrays;
@Getter
public class MultiKey {
public MultiKey(Object... keys) {
this.keys = keys;
}
private Object[] keys;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MultiKey multiKey = (MultiKey) o;
return Arrays.equals(keys, multiKey.keys);
}
@Override
public int hashCode() {
return Arrays.hashCode(keys);
}
}而groupingBy本身:
Map<MultiKey, List<VhfEventView>> groupedList = list
.stream()
.collect(Collectors.groupingBy(
e -> new MultiKey(e.getGroupingKey1(), e.getGroupingKey2())));https://stackoverflow.com/questions/29946938
复制相似问题