有没有办法调用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
,但我在一般意义上对此感到疑惑。
答案 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());
}