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

时间:2017-10-08 22:34:18

标签: java java-8 java-stream

有没有办法调用Java流API为除constructor(props, context) { super(props, context); // This will represent your component state to hold current input value. this.state = { value: "" }; // Do handler bindings in one place and not inside the render // function as it will create a new function reference on each render. this.handleChange = this.handleChange.bind(this); } handleChange(e) { this.setState({value: e.target.value}); } render () { return ( <div> <Card> <div> <label>Id</label> <input type="text" id="getId" onKeyUp={this.handleChange}/> <div> <label>Name</label> <input type="text" value={this.state.value} readOnly/> </div> </div> </Card> </div> ); } 的最后一个元素之外的所有元素执行函数,并在最后一个元素上调用另一个元素而不将其分成两个单独的调用?

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

我的用例是在最后一个元素上调用Iterable,在最后一个元素上调用repo.save(entity)

假设我有repo.saveAndFlush(entity)

我希望找到符合Iterable<FooEntity> items;

的解决方案

更新

根据@jonsharpe的评论,我的班级更新了:

items.stream().???.profit(!)

正如我在评论中提到的,我不确定这是否会注入正确的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(); } } ,所以宁愿只使用回购。我的担忧有效吗?

P.S。我意识到我的收藏界面是EntityManager而不是List,但我在一般意义上对此感到疑惑。

2 个答案:

答案 0 :(得分:2)

您可以使用reduce来模拟此类行为。 E.g:

list.stream()
    .reduce((a, b) -> {
                repo.save(a);
                return b;
            })
    .ifPresent(x -> repo.saveAndFlush(x)); 

但是,说实话,这是非常笨重的,从维护的角度来看,你最好在评论中使用@ jonrsharpe的建议 - &#34;在这个例子中,为什么不呢?然后将所有这些都保存起来。在&#34;?

之后

答案 1 :(得分:2)

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

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

如果您想特别处理最后一个元素,则Stream API不适合该作业。有可能的解决方案,但它们比使用其他API更复杂。

E.g。考虑到您的起点是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());
}