【问题标题】:Lambda Expressions for filtering in Java用于在 Java 中过滤的 Lambda 表达式
【发布时间】:2020-03-23 21:35:42
【问题描述】:

我有三个对象:

  • 爱好
  • 类型

Person.java:

public class Person
{
    private String name;
    private List<Hobby> hobbyList = new ArrayList<>();
    ...
}

爱好.java:

public class Hobby
{
    private String name;
    private Person person;
    private Type type;
    ...
}

Type.java:

public class Type
{
    private String name;
    private List<Hobby> hobbyList = new ArrayList<>();
    ...
}

Person 和 Hobby 之间是 1:m 关系,Type 和 Hobby 之间是 1:m 关系。

现在,我的问题是,我想使用 lambda 表达式过滤人员列表。只有具有特定类型的爱好的人才能在列表中。

我需要遍历这些人,以获取个人爱好列表,并且需要检查爱好是否具有特定类型。

如果没有 lambda 表达式,我将过滤以下列表:

List<Person> filteredList = new LinkedList<>();
for (Person p : persons)
{
    for (Hobby h : p.getHobbyList())
    {
        if(h.getType.getName.equals("Ball"))
        {
            if(!filteredList.contains(p))
            {
                filteredList.add(p);
            }
        }
    }
}

【问题讨论】:

  • 为什么会有从爱好到人的反向引用?如果 X 个人有相同的爱好怎么办?相反,我建议 Person ->* Hobby *1 Type
  • 一种方法,您可以获得所有涉及名称“Ball”类型的有兴趣的人,例如:List&lt;Person&gt; typeListMap = persons.stream() .flatMap(p -&gt; p.getHobbyList() .stream() .map(h -&gt; Map.entry(h.getType().getName(), p))) .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()))) .get("Ball");。请注意,此处创建的中间 Map 会根据人们的爱好类型为您提供一个映射。

标签: java lambda java-8


【解决方案1】:

照做

List<Person> filteredList = persons.stream()
                .filter(p -> p.getHobbyList().stream().anyMatch(h -> h.getType().getName().equals("Ball")))
                .collect(Collectors.toList());

[更新]

我看到您已更新问题。根据您的更新,以下内容应该适合您:

Set<Person> filteredSet = persons.stream()
                .filter(p -> p.getHobbyList().stream().anyMatch(h -> h.getType().getName().equals("Ball")))
                .collect(Collectors.toSet());

请注意,Set 会自动丢弃重复值,因此在这种情况下您无需检查 if(!filteredList.contains(p))

【讨论】:

  • @Michael - 我同意你的看法。谢谢。
  • 他实际上是在contains 检查中编辑的,所以现在匹配
  • 这不是类型正确的,是吗?看起来过滤器函数不会产生布尔值。
  • 这仍然无法正常工作... HobbyList 的过滤器出现错误
  • 是否缺少收藏或地图?
猜你喜欢
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
相关资源
最近更新 更多