如何在Java 8中使用reduce方法将Object列表转换为String列表?

3

我有一个对象如下:

class Order {
  private String code;
  private String status;
  // Constructor, getters and setter and so on
}

我需要从一组订单中创建一个代码列表,满足某个条件。 我在JavaScript中实现了类似的功能,如下所示:

const codes = orders.reduce((codeList, order) => {
  if (order.status === 'NEW') return codeList.push(order.code)
  return codeList
}, [])

使用Java 8能否实现这个目标?

2个回答

3

在Java中,你应该使用collect而不是reduce来实现此目的:

List<String> codes =
    orders.stream()
          .filter(o -> o.getStatus().equals("NEW"))
          .map(Order::getCode)
          .collect(Collectors.toList());

我已经这样做了,但这样有效吗?我的意思是,就我而言,使用这种实现方式,我需要两次遍历数组,但使用JS实现只需要一次。 - Anthony Luzquiños
3
是的,它很高效。不,它并没有“再次遍历”列表。它是一个流(stream)。输入列表只被迭代一次。 - Stephen C

1

Reduce是用于对单个结果进行聚合值的(例如AVG或SUM)。

Collect用于对集合中的聚合值。

Java 8 Streams通常比在集合上处理更有效,因为它们只处理所需内容,还可以并行处理(如果需要)。

再见


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接