Не удается разрешить конструктор в Java 8 - PullRequest
1 голос
/ 12 июня 2019

Я хочу создать клонированный список.Я использую приведенный ниже фрагмент кода, но моя IDE показывает ошибку компиляции как «Не удается разрешить конструктор», даже если MyClass имеет конструктор по умолчанию.

List<MyClass> clonedList = 
    myClassList.stream().map(MyClass::new).collect(Collectors.toList());

Я новичок в потоках, пожалуйста, помогите мнеесли мой синтаксис неправильный.

1 Ответ

5 голосов
/ 12 июня 2019

MyClass::new будет работать только в этом контексте, если ваш класс имеет конструктор, который принимает один параметр, тип которого является типом элементов Stream. Конструктор без параметров не будет работать.

myClassList.stream().map(MyClass::new)...

ведет себя как

myClassList.stream().map(e -> new MyClass(e))...

Поскольку myClassList представляет собой список MyClass экземпляров, это означает, что для работы ссылки на метод потребуется конструктор следующей подписи - MyClass (MyClass other).

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

myClassList.stream().map(e -> new MyClass())...

Конечно, это не имеет большого смысла, так как игнорирует исходные элементы Stream.

Поскольку ваша цель - клонировать List, вам нужен конструктор копирования:

public MyClass (MyClass other) {
    // copy the properties of other to this instance
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...