Java - получение списка новых объектов из потока на основе списка существующих - PullRequest
0 голосов
/ 23 декабря 2018

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

Я хочу создать список детей на основе списка людей (один человек = один ребенок).Дети должны наследовать только некоторые черты своих родителей (в данном случае, скажем, это цвет кожи).

Поскольку я несколько вынужден использовать лямбды (но также хочу узнать, как это работает), я 'Я пробовал следующее решение, но я не могу решить проблему с правильным отображением (пока не видел ничего подобного, и я делаю метод проб и ошибок).Возможно, у меня тоже плохо сделан конструктор.

public class Kid {
    private Colour colour;
    private Person person;

    public Kid(Person person) {
        this.colour = person.getColour();
    }

    public List<Kid> listOfKids() {
        return people.stream()
                     .map(e -> new Kid(e));
    }
}

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

В качестве альтернативы, вы можете использовать ссылку на метод в map как:

public List<Kid> listOfKids(List<Person> people) {
    return people.stream()
                 .map(Kid::new) // your existing constructor resolves this
                 .collect(Collectors.toList());
}

Обратите внимание, что хотя реализация конструктора компилируется нормально, если вы хотите сохранить Person и Colour как атрибуты class Kid было бы более целесообразно с помощью чего-то вроде:

// assign both attributes of the class within your constructor
public Kid(Person person, Colour colour) {
    this.person = person;
    this.colour = colour;
}

, а затем обновив функцию отображения следующим образом:

public List<Kid> listOfKids(List<Person> people) {
    return people.stream()
                 .map(p -> new Kid(p, p.getColour())) // map to the updated contructor
                 .collect(Collectors.toList());
}

Детидолжны наследовать только некоторые черты своих родителей (в данном случае, скажем, это цвет кожи).

В этом случае вы можете использовать наследование вjava, расширив свой класс Kid от Person, для которого все, что вам нужно, это

public class Kid extends Person {
     public Kid(Colour colour) {
         super(colour);
     }
}

, где определение класса Person может быть примерно таким:

public class Person {
    Colour colour;
    public Person(Colour colour) {
        this.colour = colour;
    }
}

, тогда с этим изменением вашметод будет выглядеть как

public List<Kid> listOfKids(List<Person> people) {
    return people.stream()
                 .map(p -> new Kid(p.getColour()))
                 .collect(Collectors.toList());
}
0 голосов
/ 23 декабря 2018

Предположим, у вас есть список Person , длина списка равна 10. Ввиду того, что конструктор kib вызывает метод getColour объекта person, вы должны проверить, равен ли person в списке нулю.

List<Person> people = new ArrayList<>(10);
List<Kid> kids = people.stream()
                       .filter(person -> null!=person)
                       .map(person -> new Kid(person))
                       .collect(Collectors.toList());
0 голосов
/ 23 декабря 2018

После map у вас есть Stream<Kid>, а вам нужно List<Kid>, поэтому вам нужно будет собрать список через toList().

return people.stream()
             .map(e -> new Kid(e))
             .collect(Collectors.toList());

или, если вам нужноизменяемый список, затем используйте toCollection:

return people.stream()
             .map(e -> new Kid(e))
             .collect(Collectors.toCollection(ArrayList::new));

В другой заметке вам нужно переосмыслить свой дизайн.

  1. вместо передачи целого Person вКонструктор Kid просто передает Colour ( при условии, что это перечисление ), в противном случае передается String для представления цвета.
  2. с атрибутом Person внутри Kid моделине имеет особого смысла, чтобы быть честным, это все равно, что сказать "ребенок имеет человека" ... может быть, то, что вы ищете, это Kid, чтобы унаследовать отPerson для обозначения того, что "ребенок является человеком"

и т. Д. *

...