gpt4 book ai didi

Java Streams : Do f() for N - 1 elements and g() for N. 即最后一个元素的不同函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:02:42 25 4
gpt4 key购买 nike

有没有办法调用 Java 流 API 来为 Iterable 的最后一个元素以外的所有元素执行一个函数?并在最后调用另一个而不将其分成两个单独的调用?

这将节省数组的两次传递,一次用于将数组拆分为它的头数组和尾元素,另一次用于迭代这两个并应用一个函数。

我的用例调用 repo.save(entity)除了最后一个元素和 repo.saveAndFlush(entity) 之外的所有元素在最后。

假设我有一个 Iterable<FooEntity> items;

我希望找到一个类似于 items.stream().???.profit(!) 的解决方案


更新:

这是我根据@jonsharpe 的评论更新的类(class):

public class FooWriter implements ItemWriter<FooEntityManifest> {
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();
}
}

正如我在评论中提到的,我不确定这是否注入(inject)了正确的 EntityManager所以宁愿只使用 repo 协议(protocol)。我的担忧是否成立?

附言我意识到我的 Collection 界面是List而不是 Iterable但我在一般意义上想知道这一点。

最佳答案

最简单的解决方案是平等对待所有项目

items.forEach(fooEM -> fooRepo.save(fooEM.getChangedObject()));
em.flush();

如果您想特殊处理最后一个元素,Stream API 不是完成这项工作的正确工具。有可能的解决方案,但它们会比使用其他 API 更复杂。

例如考虑到您的起点是 List:

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 Streams : Do f() for N - 1 elements and g() for N. 即最后一个元素的不同函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46636727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com