从现有列表中提取结果集的公共代码如下:
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; )?
答案 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());