java8如果没有创建,则根据索引列出get对象

时间:2018-04-05 19:38:19

标签: java java-8 java-stream optional

我尝试使用流API,可选API替换以下代码。我无法想到解决方案。请帮助我。

注意:请不要担心功能性。这不是确切的客户端代码,因此从外部角度来看,一些操作没有意义。

getevent

2 个答案:

答案 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;
}