Ash*_*ngh 5 java arraylist java-8 java-stream collectors
我只是想尝试创建一些类似于Collectors.toList()我自己的东西,但似乎没有用
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;
}
Run Code Online (Sandbox Code Playgroud)
}
我的问题是,如果ArrayList::new这里不起作用,将起作用.我尝试了不同的变化,但似乎都没有
只需改变它,
tracings.stream().collect(ArrayList::new, (left, right) -> left.add(right), (left, right) -> {
left.addAll(right);
});
Run Code Online (Sandbox Code Playgroud)
你需要的是一个BiConsumer不是BinaryOperator.你上面传递的是一个BinaryOperator.
这是一个例子BinaryOperator.
BinaryOperator<List<Integer>> s = (left, right) -> {
left.addAll(right);
return left;
};
Run Code Online (Sandbox Code Playgroud)
作为一种优秀的工程实践,总是更喜欢lambdas的方法引用.所以这里是使用方法引用代替lambdas的增强版本.
tracings.stream().collect(ArrayList::new, List::add, List::addAll);
Run Code Online (Sandbox Code Playgroud)
你似乎在寻找:
tracings.stream()
.collect(ArrayList::new,
ArrayList::add,
ArrayList::addAll);
Run Code Online (Sandbox Code Playgroud)
这与lambda表示相同:
tracings.stream()
.collect(ArrayList::new,
(left, right) -> left.add(right),
(left, right) -> left.addAll(right)); // notice no 'return'
Run Code Online (Sandbox Code Playgroud)
原因:Stream.collect期望a BiConsumer作为参数,其具有返回类型的accept方法void.
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |