java8列表基于索引获取对象,如果不创建

java8列表基于索引获取对象,如果不创建,java,java-8,java-stream,optional,Java,Java 8,Java Stream,Optional,我正在尝试使用流API(可选API)替换下面的代码。我想不出一个解决办法。请在这方面帮助我 注意:请不要为功能费心。这不是确切的客户机代码,因此从外部角度来看,某些操作没有意义 public class Person { private String fName; private String lName; private String empId; // constructors, setters, getters } .. MAIN CLASS.. private bool

我正在尝试使用流API(可选API)替换下面的代码。我想不出一个解决办法。请在这方面帮助我

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

public class Person {

private String fName;   
private String lName;   
private String empId;
// constructors, setters, getters
}

.. MAIN CLASS..

private boolean indexExists(final List <Person> list, final int index) {
    return index >= 0 && index < list.size();
}

 public void mainFunction() {
    Person per1 = new Person("fname1", "lname1", "101");        
    Person per2 = new Person("fname2", "lname2", "102");
    List<Person> allPersons = new ArrayList<>();
    allPersons.add(per1);
    allPersons.add(per2);

    System.out.println(allPersons);

    List<String> lNamesAppend = Arrays.asList("123","456","789");


    // CAN THE BELOW BE REPLACED IN JAVA8 ?

    int index = 0;
    Person person = null;
    for(String str : lNamesAppend) {
        if(indexExists(allPersons, index)) {
            person = allPersons.get(index++);

        } else {
            person = new Person("fname" + index++ , "lname" + index++, "10" + index++);
            allPersons.add(person);
        }
        person.setlName(str + index);
    }

    System.out.println(allPersons);
}
公共类人物{
私有字符串fName;
私有字符串名称;
私有字符串empId;
//构造函数、setter、getter
}
.. 主课。。
私有布尔indexExists(最终列表,最终整数索引){
返回索引>=0&&index
以下是选项之一。请注意,鉴于功能不明确,代码并不干净,但您可以了解如何实现它

//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;
}
//main方法
{
....
AtomicInteger索引=新的AtomicInteger();
lNamesAppend.stream()
.map(str->indexists(allPersons,index.get())?
新的ImmutablePair(str,allPersons.get(index.getAndIncrement()):
新的ImmutablePair(str,getPerson(allPersons,index)))
.forEach(p->p.getRight().setlName(p.getLeft()+索引));
}
private Person getPerson(列出所有人员,原子整数索引){
Person-Person=新的Person(“fname”+index.getAndIncrement(),“lname”+index.getAndIncrement(),“10”+index.getAndIncrement());
所有人。添加(人);
返回人;
}
您可以使用流API按照相同的逻辑创建代码,但是不修改逻辑就没有意义。毕竟,流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));

谢谢你的意见。
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()));