此问题在此处已有答案:
Why lambda inside map is not running?(1个答案)
Stream on Map doesn't save .map changes(2个答案)
Lambda in Stream.map/filter not called(4个答案)
2天前关闭。
我的IDE试图告诉我,有一种更好的方法可以通过使用函数操作(如Java 8中引入的流)来执行某些循环。我从来没有深入研究过流,当我试图了解它的要点时,我很难理解它的要点。即使在看了Programming with Streams in Java 8 | Venkat Subramaniam之后。
我阅读了一些指南和帖子,并尝试使用流重构一个简单的for循环:
for (Customer c : this.customers) customerRepo.save(c);
至
this.customers.stream().map(c -> customerRepo.save(c));
编译的时候我没有收到任何警告,运行的时候也没有异常。但是,它似乎不起作用,没有记录被保存到我的数据库中。我想我在这里做错了什么,如果有人能纠正我,我会很感激的。
1条答案
按热度按时间slhcrj9b1#
一个流应该包含一个 * 终端操作 * 才能被执行(如
collect
,reduce
,forEach
等)。您的流缺少一个。***请注意***没有终端操作的流是完全有效的。在某些情况下,创建这样的流是非常有意义的。例如,你可以在一个方法中生成一个流,然后将它传递给另一个方法,在那里它将附加一个终端操作并执行。
以下是documentation的一段引言:
为了执行一个计算,流操作被组合到一个流管道中。(其可以是数组、集合、生成器函数、I/O通道等)、零个或多个中间操作(将一个流转换为另一个流,如filter(Predicate)),以及一个终端操作(这会产生一个结果或副作用,例如count()或forEach(Consumer))。流是惰性的;仅在启动终端操作时才对源数据执行计算,并且仅在需要时使用源元素。
在这种情况下,您不需要流,而是可以使用
Iterable.forEach()
,方法是在客户集合上调用forEach()
:可以使用method reference:
由于
JpaRepository
声明了一个允许保存一组实体JpaRepository.saveAll(Iterable<S> entities)
的方法,因此在这种情况下,这是正确的方法。如需详细信息,请参阅: