Java 通过流API按自定义字段选择不同的对象

Java 通过流API按自定义字段选择不同的对象,java,lambda,java-8,Java,Lambda,Java 8,我正在尝试将Java循环代码转换为Java8流。 我有一个ArrayList的Row对象,该对象应将所有deliveredLength相加,不包括行对象,该行与另一个行对象具有相同内容 Java循环 public int getDeliveredLength() { List<Row> distinct = new ArrayList<>(); for (Row row : rows) { if (sameContent(distinct,

我正在尝试将Java循环代码转换为Java8流。 我有一个
ArrayList
Row
对象,该对象应将所有
deliveredLength
相加,不包括
对象,该行与另一个
对象具有相同内容

Java循环

public int getDeliveredLength() {
    List<Row> distinct = new ArrayList<>();
    for (Row row : rows) {
        if (sameContent(distinct, row)) {
            continue;
        }
        distinct.add(row);
    }
    int sum = 0;
    for (Row row : distinct) {
        sum += row.getDeliveredLength();
    }
    return sum;
}

private boolean sameContent(List<Row> list, Row other) {
    for (Row row : list) {
        if (other.sameContent(row)) {
            return true;
        }
    }
    return false;
}

为什么要编写一个新方法
sameContent
,而不重写
equals
方法?使用
equals
的优点是,标准库中的许多类和方法调用它来比较类的实例

如果使用
equals
,则可以使用标准的
Stream.distinct()
方法,该方法返回不同值的流。因此,您的Java 8流表达式变成:

rows.stream().distinct().mapToInt(Row::getDeliveredLength).sum()

为什么要编写一个新方法
sameContent
,而不重写
equals
方法?使用
equals
的优点是,标准库中的许多类和方法调用它来比较类的实例

如果使用
equals
,则可以使用标准的
Stream.distinct()
方法,该方法返回不同值的流。因此,您的Java 8流表达式变成:

rows.stream().distinct().mapToInt(Row::getDeliveredLength).sum()

可能不仅由其内容定义。例如,它的indexRow包含开始、结束、注释和内容,因此equals和hashcode需要包含所有字段。sameContent()仅检查内容字段或
来自外部库。虽然可以将其包装到具有适当equals/hashCode的自定义对象中,但像在
行中一样,
可能不仅仅由其内容定义。例如,它的indexRow包含开始、结束、注释和内容,因此equals和hashcode需要包含所有字段。sameContent()仅检查内容字段或
来自外部库。但是,可以将其包装到具有适当的equals/hashCode的自定义对象中,例如,您尝试过吗?有错误吗?请检查并提问。您试过了吗?有错误吗?请检查并提问。