java8列表基于索引获取对象,如果不创建
我正在尝试使用流API(可选API)替换下面的代码。我想不出一个解决办法。请在这方面帮助我 注意:请不要为功能费心。这不是确切的客户机代码,因此从外部角度来看,某些操作没有意义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
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()));