我尝试使用流API,可选API替换以下代码。我无法想到解决方案。请帮助我。
注意:请不要担心功能性。这不是确切的客户端代码,因此从外部角度来看,一些操作没有意义。
getevent
答案 0 :(得分:1)
你可以使用Stream API按照相同的逻辑创建代码,但没有修改逻辑就没有意义。毕竟,Stream API允许您表达意图而不是迭代逻辑,至少在您有合适的任务时。如果不合适,更改代码没有任何优势。
在你的情况下,逻辑从一开始就是有缺陷的,因为你正在轮询索引的有效性,尽管你事先知道列表的有效索引形成从零到列表大小的范围,只做两个完全不同的操作,在同一循环中更新旧条目或创建新条目。
与直接的方法相比,不做两件事:
int existing = Math.min(allPersons.size(), lNamesAppend.size());
for(int index = 0; index < existing; index++)
allPersons.get(index).setlName(lNamesAppend.get(index)+index);
for(int index = existing, end = lNamesAppend.size(); index < end; index++)
allPersons.add(new Person("fname"+index, lNamesAppend.get(index)+index, "10"+index));
我假设新index++
三次Person
是一个错误。
您可以使用Stream API执行相同操作:
int existing = Math.min(allPersons.size(), lNamesAppend.size());
IntStream.range(0, existing)
.forEach(index -> allPersons.get(index).setlName(lNamesAppend.get(index)+index));
allPersons.addAll(IntStream.range(existing, lNamesAppend.size())
.mapToObj(index -> new Person("fname"+index,lNamesAppend.get(index)+index,"10"+index))
.collect(Collectors.toList()));
答案 1 :(得分:0)
以下是其中一个选项。请注意,代码不是CLEAN,因为功能不明确,但您可以了解如何实现它
//mainMethod
{
....
AtomicInteger index = new AtomicInteger();
lNamesAppend.stream()
.map(str-> indexExists(allPersons, index.get()) ?
new ImmutablePair<>(str, allPersons.get(index.getAndIncrement())) :
new ImmutablePair<>(str, getPerson(allPersons, index)))
.forEach(p->p.getRight().setlName(p.getLeft()+index));
}
private Person getPerson(List<Person> allPersons, AtomicInteger index) {
Person person = new Person("fname" + index.getAndIncrement(), "lname" + index.getAndIncrement(), "10" + index.getAndIncrement());
allPersons.add(person);
return person;
}