我有一个定义如下的类
public class MyClass {
int val;
type t;
}其中类型是值A,B,C,D,.的枚举。
我有一个MyClass对象列表,我希望筛选出列表中每种类型的第一个元素。
例如:-
所列清单:
{{1,A},{2,A},{4,B},{5,B},{3,C}}输出:
{{1,A},{4,B},{3,C}}有没有一种方法可以使用列表流的filter()来解决这个问题?
发布于 2017-09-11 05:40:57
我不确定是否有办法用一个Stream管道来完成这个任务,但是您可以用两个管道来完成。
第一个管道将对象按val属性分组(生成一个Map<Integer,List<MyClass>>),第二个管道接受第一个管道生成的每个List的第一个对象,并将它们收集到输出List中。
List<MyClass>
filtered = mycl.stream ()
.collect (Collectors.groupingBy (c -> c.val))
.values ()
.stream ()
.map (l -> l.get (0))
.collect (Collectors.toList ());发布于 2017-09-11 06:10:31
这里有一个不像我所希望的那样优雅的解决方案,但它奏效了:
Set<MyType> typeSet = new HashSet<>();
List<MyClass> result = list.stream()
.filter(c -> typeSet.add(c.getType())).collect(
Collectors.toList());发布于 2017-09-11 05:35:42
我不确定是否有任何直接的方法,但你可以通过做
1)首先使用流的带过滤器的findFirst方法(TypeOf类型)。2)对所有类型执行上述步骤。3)将上述数据合并为一个列表。
https://stackoverflow.com/questions/46148694
复制相似问题