【问题标题】:java8 List get object based on index, if not createjava8 List 根据索引获取对象,如果不创建
【发布时间】:2018-04-05 19:38:18
【问题描述】:

我正在尝试使用流 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);
}

【问题讨论】:

    标签: java java-8 java-stream optional


    【解决方案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));
    

    我认为为新的Person 执行三次index++ 是一个错误

    您可以使用 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()));
    

    【讨论】:

      【解决方案2】:

      以下是选项之一。请注意,代码不是 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;
      }
      

      【讨论】:

      • 感谢您的意见。
      猜你喜欢
      • 1970-01-01
      • 2016-01-10
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多