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

时间:2015-03-23 17:09:44

标签: 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);
    }
}

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

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

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

我知道最后可能是品味问题。如果是这样,你认为我的例子是一个完全可行的案例,可以总是被溪流和lambdas取代作为一种良好的做法(我有意识地没有使用术语&#34;最佳实践&#34; )?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您的情况肯定可以转换为lambda(没有错误)。实际上,您不需要预先创建列表,而是在那里使用Collectors

List<Node> results = rsp.getNodes().stream().filter(node -> {
              return node.isValid() && node.getType == NodeType.TEST &&...;
         }).collect(Collectors.toList());

但是,随着您的过滤器逻辑开始增长,或者您开始​​在循环或条件中添加更多逻辑,lambda可能会开始看起来很难看。遵循旧样式for循环可能更具可读性,但这完全取决于场景。你无法概括lambda的位置和循环的使用位置。

顺便说一句,通过避免显式return

,可以进一步修改lambda
List<Node> results = rsp.getNodes().stream()
              .filter(node -> node.isValid() && node.getType == NodeType.TEST && ...)
              .collect(Collectors.toList());