有没有一种方法可以调用Java流API,以对Iterable的最后一个元素(除了最后一个元素)执行所有功能,然后在最后一个元素上调用另一个元素而又不将其拆分为两个单独的调用?
这样可以节省两次遍历,一次遍历将其拆分为头数组和尾部元素,另一遍遍历这两次并应用函数.
我的用例是在除最后一个元素之外的所有元素上调用repo.save(entity),在最后一个元素上调用repo.saveAndFlush(entity).
假设我有一个Iterable< FooEntity>.物品;
我希望沿着items.stream().???.profit(!)寻求解决方案
更新:
这是根据@jonsharpe的评论更新的我的课程:
public class FooWriter implements ItemWriter {
private final FooRepository fooRepo;
@PersistenceContext
private EntityManager em;
@Autowired
public FooWriter(FooRepository fooRepo) {
this.fooRepo = fooRepo;
}
@Override
public void write(List extends FooEntityManifest> items) {
items.forEach(fooEM -> {
FooEntity foo = fooEM.getChangedObject();
fooRepo.save(foo);
});
em.flush();
}
}
正如我在评论中提到的那样,我不确定这是否注入了正确的EntityManager,因此宁愿仅使用存储库.我的担忧有效吗?
附言我意识到我的收集接口是List而不是Iterable的,但是我在总体上想知道这一点.
解决方法:
最简单的解决方案是将所有物品均等地对待
items.forEach(fooEM -> fooRepo.save(fooEM.getChangedObject()));
em.flush();
如果要特别对待最后一个元素,则Stream API不是适合此工作的工具.有可能的解决方案,但是它们将比使用其他API更为复杂.
例如.考虑到您的起点是一个列表:
if(!items.isEmpty()) {
int last = items.size()-1;
items.subList(0, last).forEach(fooEM -> fooRepo.save(fooEM.getChangedObject()));
fooRepo.saveAndFlush(items.get(last).getChangedObject());
}
标签:java-8,java-stream,java
来源: https://codeday.me/bug/20191025/1930158.html