I was just trying to create somewhat similar to Collectors.toList() of my own but it doesn't seem to work
import java.util.ArrayList;
public class ShipmentTracingDTO {
boolean destination = false;
public ShipmentTracingDTO(Boolean destination) {
    this.destination = destination;
}
public ShipmentTracingDTO() {
}
public static void main(String[] args) {
    ArrayList<ShipmentTracingDTO> tracings = new ArrayList<>();
    tracings.add(new ShipmentTracingDTO(true));
    tracings.add(new ShipmentTracingDTO(true));
    tracings.add(new ShipmentTracingDTO(false));
    tracings.add(new ShipmentTracingDTO(false));
    ArrayList<ShipmentTracingDTO> newTracings = new ArrayList<>();
// Error coming for ArrayList::new : The constructed object of type ArrayList is 
//incompatible with the descriptor's return type: R
    tracings.stream().collect(ArrayList::new, (left, right) -> left.add(right), (left, right) -> {
        left.addAll(right);
        return left;
    });
}
private boolean getDestination() {
    return destination;
}
}
My question is if ArrayList::new doesn't work here, what will work. I tried different variation but none seems to work
Just change it like so,
tracings.stream().collect(ArrayList::new, (left, right) -> left.add(right), (left, right) -> {
    left.addAll(right);
});
What you need is a BiConsumer NOT a BinaryOperator. What you are passing above is a BinaryOperator.
Here's an example BinaryOperator.
BinaryOperator<List<Integer>> s = (left, right) -> {
            left.addAll(right);
            return left;
};
As a good engineering practice, always prefer method references to lambdas. So here's the enhanced version using method references in place of lambdas.
tracings.stream().collect(ArrayList::new, List::add, List::addAll);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With