Лямбда-выражения для фильтрации в Java - PullRequest
0 голосов
/ 23 марта 2020

У меня есть три объекта:

  • Человек
  • Хобби
  • Тип

Человек. 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;
    ...
}

Тип. java:

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

Между человеком и хобби есть отношение 1: m и между типом и Хобби - это отношение 1: m.

Теперь моя проблема в том, что я хочу отфильтровать список людей, используя лямбда-выражения. В списке должны быть только те, у кого есть хобби с указанным типом c.

Мне нужно перебрать людей, чтобы получить индивидуальный список хобби и проверить, есть ли у хобби определенный тип c.

Без лямбда-выражений я бы Отфильтруйте список следующим образом:

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);
            }
        }
    }
}

1 Ответ

0 голосов
/ 23 марта 2020

Сделайте это как

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)) в этом случае.

...