java - 通过 Stream API 按自定义字段选择不同的对象

标签 java lambda java-8

<分区>

我正在尝试将 Java 循环代码转换为 Java 8 流。 我有一个 Row 对象的 ArrayList,它应该对所有 deliveredLength 求和,但不包括具有相同内容的 Row 对象另一个具有相同内容的 Row 对象。

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

Java 8 流代码是什么?

public int getDeliveredLength() {
  return rows.stream().filter(??).map(??).mapToInt(Row::getDeliveredLength).sum()
}

最佳答案

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

鉴于您使用了 equals,您可以使用标准的 Stream.distinct() 方法,它返回不同值的流。所以你的 Java 8 流表达式变成:

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

关于java - 通过 Stream API 按自定义字段选择不同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33874669/

相关文章:

python - lambda和常规函数之间的python有什么区别?

c# - 从对象和嵌套对象中获取一些属性

lambda - 如何在 Java 功能接口(interface)中使用 andThen 或类似方法包装函数

java - 在服务器内存中存储 java 对象

java - WatchService.take() 在 Windows-7-x64 上观察远程目录中的更改时不会等待

Java 字符串构造函数优化

Java 8 LocalDate 不会解析有效的日期字符串

java - 需要有关使用 SQL 和 java 程序的分离度的帮助

c# - 完整.NET Framework和.NET Core之间的lambda表达式差异

Java HashMap : get all keys greater than X value