【发布时间】:2015-09-17 13:55:36
【问题描述】:
我正在从丑陋的嵌套 for 循环转变为在 java 中设计精美的 lambda 表达式。
这是我的实际代码
for (String foo : foos) {
for (Bar bar : bars) {
if (bar.getFoo().equals(foo)) {
FooBar fooBar = new FooBar();
fooBar.setBar(bar);
listOfFooBar.add(fooBar);
break;
}
}
}
我的实际 lambda 代码替换上面的代码
foos.forEach(i -> bars.stream().filter(p -> p.getFoo().equals(i)).findFirst().ifPresent(p -> {
FooBar s = new FooBar();
fooBar.setBar(bar);
listOfFooBar.add(fooBar);
}));
我的问题是,有没有办法用某种 collect() 方法填充 listOfFooBar?
类似listOfFooBar = foos.forEach(.....).collect(Collectors.toList());
一个事实是,bars 将始终包含每个 foo,foos 基本上是 bars 的一小部分。
如果有更好的方法(在性能或优雅方面)来做那个 lambda,请分享。
【问题讨论】:
-
我认为应该是
bar.getFoo()而不是bar.getBar(),对吗? -
@FedericoPeraltaSchaffner 是的,这确实更有意义:)
-
为什么每个人都想先用
forEach做所有事情?Stream有更多的方法。 -
@Holger 我称之为“for-each-itis”,我相信这是或将是一种常见的代码气味。我认为原因是
forEach可能是不熟悉 FP 结构的程序员最容易理解的结构。由于命令式程序有很多循环,最简单的第一步是使用forEach将它们转换为流。不幸的是,它并不容易引向任何地方,然后人们就会陷入困境。 -
顺便说一句,这并不是对 OP 的批评。他尝试了一些东西,也许是感觉有更好的方法,然后来到StackOverflow提问和学习。 +1
标签: java lambda java-8 java-stream