Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot resolve constructor in Java 8

I want to create a cloned list. I am using the below code snippet, but my IDE is showing a compilation error as "Cannot resolve constructor" even though MyClass has a default constructor.

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

I am new to streams, please help me if my syntax is wrong.

like image 886
Rohit Avatar asked Apr 17 '26 03:04

Rohit


1 Answers

MyClass::new will only work in this context if your class has a constructor that takes a single parameter whose type is the type of the elements of the Stream. Parameter-less constructor won't work.

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

behaves as

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

Since myClassList is a list of MyClass instances, this means a constructor of the following signature will be required in order for the method reference to work - MyClass (MyClass other).

You can still use the parameter-less constructor with the following lambda expression:

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

Of course, that makes little sense, since it ignores the original elements of the Stream.

Since your goal is to clone the List, you need a copy constructor:

public MyClass (MyClass other) {
    // copy the properties of other to this instance
}
like image 86
Eran Avatar answered Apr 18 '26 16:04

Eran



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!