java - 流收集方法的有效供应商

标签 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 在这里不起作用,那么什么会起作用。我尝试了不同的变体,但似乎都不起作用

最佳答案

就这样改吧

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);

关于java - 流收集方法的有效供应商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54124208/

相关文章:

Java将两个不同大小的List合并为HashMap

java - 当尝试在 Eclipse 中运行程序时,启动保持在 92%

java - 检查 ArrayList 中两个双引号之间的元素

Java Collectors.groupingBy()---List 是有序的吗?

java - 主机名在生产环境的 Logback/SLF4J 中未定义

java - 如何确保列表中的项目是连续的?

java - 如何按用户编号对用户的 ArrayList 进行排序

java - 使用 Java 8 的 Spring 4 + MyBatis 集成问题

Java Lambda 引用封闭对象 : Replace with Private Static Class?

java - for 循环后输入未写入文件