有效供应商的流收集方法

时间:2019-01-10 08:03:52

标签: 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;
}

}

我的问题是,如果ArrayList::new在这里不起作用,那将起作用。我尝试了其他变化,但似乎没有效果

3 个答案:

答案 0 :(得分:6)

只需更改它,

tracings.stream().collect(ArrayList::new, (left, right) -> left.add(right), (left, right) -> {
    left.addAll(right);
});

您需要的是BiConsumer而不是BinaryOperator。您上面传递的是BinaryOperator

下面是一个示例BinaryOperator

BinaryOperator<List<Integer>> s = (left, right) -> {
            left.addAll(right);
            return left;
};

作为良好的工程实践,始终首选使用方法引用而不是lambda。因此,这是使用方法引用代替lambda的增强版本。

tracings.stream().collect(ArrayList::new, List::add, List::addAll);

答案 1 :(得分:5)

您似乎正在寻找:

tracings.stream()
        .collect(ArrayList::new, 
                 ArrayList::add, 
                 ArrayList::addAll);

与lambda表示相同:

tracings.stream()
        .collect(ArrayList::new, 
                 (left, right) -> left.add(right), 
                 (left, right) -> left.addAll(right)); // notice no 'return'

原因Stream.collect期望以BiConsumer作为参数,它具有accept返回类型的void方法。

答案 2 :(得分:1)

  

我只是试图创建类似于Collectors.toList()的   我自己的,但似乎不起作用

虽然其他答案指定您做错了什么,但值得注意的是,如果您尝试创建类似于toList()的内容,但同时指定返回的列表类型,那么我建议您使用toCollection是为此专门制作的。

tracings.stream().collect(Collectors.toCollection(ArrayList::new));

尽管这并不比:

new ArrayList<>(tracings);

更短,更易读。