Java 通过流API按自定义字段选择不同的对象
我正在尝试将Java循环代码转换为Java8流。 我有一个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,
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的自定义对象中,例如,您尝试过吗?有错误吗?请检查并提问。您试过了吗?有错误吗?请检查并提问。