Как использовать поток в Java 8 фильтровать два объекта списка и установить значение нового списка - PullRequest
3 голосов
/ 11 июля 2019

Я использую Java 8, и у меня есть два объекта выглядят так:

Класс Person:

public class Person {

    private String id;
    private String name;

    public Person() {
    }

    public Person(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

Класс Person1:

public class Person1 {
    private String id;
    private String name;

    public Person1() {
    }

    public Person1(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person1{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

У меня два спискакак:

 List<Person> persons= Arrays.asList(new Person("1","A"),new Person("2","B"));
  List<Person1> persons1 = Arrays.asList(new Person1("3","C"),new Person1("1","F"));

Теперь я хочу использовать поток Java 8 цикла два списка и сравнить.Если какой-либо объект в списке лиц равен лицу 1, я создам новый список и установлю его с новым значением.Пример: Если Person1 ("1", "F") равен Person ("1", "A") , потому что я использую id для сравнения, я получаю имя от Person1, установленное вЧеловек.Результат: Person ("1," F ") и добавьте в него два новых списка.

Мой код при использовании для:

 for (Person person : persons) {
            for (Person1 person1 : persons1 ) {
                if (person1.getId().equals(person.getId())) {
                    person.setName(person1.getId());
                    break;
                }
            }
        }

Теперь я хочу преобразовать его в поток с новым спискомвыглядеть так:

 List<Person> personList =
                list.stream()
                        .filter (
                                person -> list1.stream()
                                        .anyMatch(person1 -> person1.getId()== person.getId()))
                        .collect(Collectors.toList());

Но это только фильтр лиц. Я хочу сравнить два объекта списка. Если один и тот же идентификатор, я хочу установить имя из объекта в Person1 лиц. Я знаю, что мы можем использовать карту в потоке Java 8но я не могу как это сделать. Пожалуйста, помогите

Ответы [ 2 ]

5 голосов
/ 11 июля 2019

Некоторые задачи лучше всего выполнять с помощью потоков, а другие с итерацией.Многие задачи лучше всего решить путем сочетания двух подходов.В этом решении потоки используются для построения карты, а затем итерация используется для обновления соответствующего имени человека.Ваше решение выполняется за квадратичное время, тогда как это решение работает с линейной временной сложностью.

Map<String, String> idToNameMap = persons1.stream()
    .collect(Collectors.toMap(Person1::getId, Person1::getName, (a, b) -> a));
for (Person person : persons) {
    if (idToNameMap.containsKey(person.getId())) {
        person.setName(idToNameMap.get(person.getId()));
    }
}
1 голос
/ 11 июля 2019

Это не самый красивый ответ и т. Д., Но я думаю, это поможет вам понять, как это работает.

List<Person> collect = persons.stream()
        .filter(person -> persons1.stream().anyMatch(person1 -> person1.getId() == person.getId()))
        .map(person -> {
            Person1 getted = persons1.stream()
                .filter(person1 -> person1.getId() == person.getId())
                .findAny()
                .orElseGet(null);
            if (getted == null) throw new IllegalStateException("Should be Impossible");
            person.setName(getted.getName());
            return person;
        })
        .collect(Collectors.toList());
...