Как фильтровать данные с использованием потоков и flatMap? - PullRequest
0 голосов
/ 22 января 2019

У меня есть класс

public class Person
{
    private int          _id;
    private String       _name;
    private int          _age;
    private List<String> _interests;

    public Person()
    {
    }

    public Person(int id, String name, int age, List<String> interests)
    {
        _id = id;
        _name = name;
        _age = age;
        _interests = interests;
    }

    public int getId()
    {
        return _id;
    }

    public void setId(int id)
    {
        _id = id;
    }

    public String getName()
    {
        return _name;
    }

    public void setName(String name)
    {
        _name = name;
    }

    public int getAge()
    {
        return _age;
    }

    public void setAge(int age)
    {
        _age = age;
    }

    public List<String> getInterests()
    {
        return _interests;
    }

    public void setInterests(List<String> interests)
    {
        _interests = interests;
    }
}

У меня есть основной метод

public class Main
{
    public static void main(String[] args)
    {
        List<Person> people = Arrays.asList(
            new Person(1, "Alex", 23, Arrays.asList("hockey", "football", "google")),
            new Person(2, "Brad", 18, Arrays.asList("hockey", "tennis")),
            new Person(3, "Felix", 22, Arrays.asList("volleyball", "tennis", "hockey")),
            new Person(4, "Brandon", 19, Arrays.asList("hockey", "football", "google"))
        );
    }

}

Вопрос в том, как напечатать человека и его интересы без дубликатов, которые имеют возраст более 21 года.используя stream и flatMap.Так что, в общем, я должен получить «Алекса» с хоккеем, футболом и Google и «Феликса» с волейболом и теннисом (хоккей - дубликат)

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Это тоже будет работать.

import java.util.*;
import java.util.stream.Collectors;

public class Main
{
    public static void main(String[] args)
    {
        List<Person> people = Arrays.asList(
            new Person(1, "Alex", 23, Arrays.asList("hockey", "football", "google")),
            new Person(2, "Brad", 18, Arrays.asList("hockey", "tennis")),
            new Person(3, "Felix", 22, Arrays.asList("volleyball", "tennis", "hockey")),
            new Person(4, "Brandon", 19, Arrays.asList("hockey", "football", "google"))
        );

        Set<String> interestSet = new HashSet<>();

        people.stream().filter(f -> f.getAge() >21).flatMap(f -> {
            List<String> list = f.getInterests().stream().filter(in -> !interestSet.contains(in)).collect(Collectors.toList());
            for (String i : list) {
                interestSet.add(i);
            }
            return Arrays.asList(new Person(f.getId(),f.getName(),f.getAge(),list)).stream();
        }).forEach(p -> System.out.println(p.getName() + " " + p.getAge() + " "+ p.getInterests()));
    }

Вы также можете попробовать поместить if (f.getAge ()> 21) в flatMap для удаления filter ().

0 голосов
/ 22 января 2019

interestSet для поддержки интересов уже обработанных людей, которые будут использоваться для фильтрации других людей

    List<Person> personList = new ArrayList<>();
    Set<String> interestSet = new HashSet<>();
    people.stream()
            .filter(p -> p.getAge() > 21)
            .forEachOrdered(p -> {
                List<String> interest = p.getInterests().stream()
                        .filter(i -> !interestSet.contains(i))
                        .collect(Collectors.toList());
                interestSet.addAll(interest);
                p.setInterests(interest);
                personList.add(p);

            });
    System.out.println(personList);

output

[Person{_id=1, _name='Alex', _age=23, _interests=[hockey, football, google]}, Person{_id=3, _name='Felix', _age=22, _interests=[volleyball, tennis]}]
...