f函数java_Java流:对N-1个元素执行f(),对N个元素执行g(),即,最后一个元素使用不同的函数...

有没有一种方法可以调用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值