在提取结果集时是否应该使用新的流lambdas?

mem*_*und 1 java lambda java-8 java-stream

从现有列表中提取结果集的公共代码可以如下:

List<Node> results;
for (Node node : rsp.getNodes()) {
    if (node.isValid() && node.getType == NodeType.TEST &&...) {
        if (results == null) {
            results = new ArrayList<>();
        }
        results.add(node);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在使用java 8和lambdas,因为建议总是使用流来支持?

rsp.getNodes().stream.filter(node -> {
    return node.isValid() && node.getType == NodeType.TEST &&...;
}).forEach(node -> results.add(node));
Run Code Online (Sandbox Code Playgroud)

对我来说,最近从java8开始,这看起来并不比现在的java7代码更清晰.无论如何你有更多的经验,并且可以肯定地推荐我使用这些类型的"快捷方式"与lambdas,而不是旧的foreach风格?

我知道最后它可能是一个品味问题.如果是的话,你会觉得我的例子是一个完全可行的情况下,可以始终与流和lambda表达式作为一个很好的做法(我有意识地不使用术语"最佳实践")所取代?

Oli*_*Oli 6

也许分离出你要过滤的条件,然后你也可以使用方法引用:

List<Node> results = rsp.getNodes().stream()
    .filter(Node::isValid)                      // Method reference
    .filter(n -> n.getType == NodeType.TEST)    // Lambda
    .filter(...)
    .collect(Collectors.toList());              // Produces List from Stream
Run Code Online (Sandbox Code Playgroud)

  • @membersound没有任何不利因素.`filter()`会像`&&`那样短路. (3认同)
  • @membersound在这种情况下你会的. (2认同)