首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8属性筛选器

Java 8属性筛选器
EN

Stack Overflow用户
提问于 2017-09-11 05:25:19
回答 4查看 5K关注 0票数 3

我有一个定义如下的类

代码语言:javascript
复制
public class MyClass {
  int val;
  type t;
}

其中类型是值A,B,C,D,.的枚举。

我有一个MyClass对象列表,我希望筛选出列表中每种类型的第一个元素。

例如:-

所列清单:

代码语言:javascript
复制
{{1,A},{2,A},{4,B},{5,B},{3,C}}

输出:

代码语言:javascript
复制
{{1,A},{4,B},{3,C}}

有没有一种方法可以使用列表流的filter()来解决这个问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-09-11 05:40:57

我不确定是否有办法用一个Stream管道来完成这个任务,但是您可以用两个管道来完成。

第一个管道将对象按val属性分组(生成一个Map<Integer,List<MyClass>>),第二个管道接受第一个管道生成的每个List的第一个对象,并将它们收集到输出List中。

代码语言:javascript
复制
List<MyClass>
  filtered = mycl.stream ()
                 .collect (Collectors.groupingBy (c -> c.val))
                 .values ()
                 .stream ()
                 .map (l -> l.get (0))
                 .collect (Collectors.toList ());
票数 3
EN

Stack Overflow用户

发布于 2017-09-11 06:10:31

这里有一个不像我所希望的那样优雅的解决方案,但它奏效了:

代码语言:javascript
复制
 Set<MyType> typeSet = new HashSet<>();
    List<MyClass> result = list.stream()
            .filter(c -> typeSet.add(c.getType())).collect(
                    Collectors.toList());
票数 1
EN

Stack Overflow用户

发布于 2017-09-11 05:35:42

我不确定是否有任何直接的方法,但你可以通过做

1)首先使用流的带过滤器的findFirst方法(TypeOf类型)。2)对所有类型执行上述步骤。3)将上述数据合并为一个列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46148694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档