代码之家  ›  专栏  ›  技术社区  ›  Speise

如果Java8中存在最小大小条件,如何从列表中删除项?

  •  -1
  • Speise  · 技术社区  · 7 年前

    我只想从列表中删除一个项目,以防它不是集合中的最后一个。

    例如:

    List<String> items = ....
    Iterator<String> it = items.iterator();
    while (it.hasNext() && items.size() > 1) {
    String item = it.next();
       if (condition(item)) {
         it.remove();
       }
    }
    

    通过在Java8中使用流,是否可以以更优雅的方式实现同样的功能?

    2 回复  |  直到 7 年前
        1
  •  5
  •   GBlodgett    7 年前

    如果需要根据条件删除元素,除非它是列表中可以使用的最后一项 removeIf() 其中:

    删除此集合中满足给定谓词的所有元素。

    删除() sublist() 若要删除除最后一个元素以外的所有元素,请执行以下操作:

    //If all the elements would be removed, use sublist to get every element but last one
    //Clear sublist
    if(items.stream().allMatch(e -> condition(e))) {
        items.subList(0, items.size() -1).clear();
    } else {
        //else it is safe to directly call removeIf()
        items.removeIf(e -> condition(e));
    }
    

    或者确保 condition(e) 仅检查一次,您可以执行以下操作:

    items.subList(0, items.size() -1).removeIf(e -> condition(e)); 
    if(items.size() > 1 && condition(items.get(items.size()-1))) {
         items.remove(items.size()-1);
    }
    

    (感谢@Holger的建议)

        2
  •  0
  •   Nacho Soto    7 年前

    您可以获取列表的最后一项,并在最后一个元素不满足条件时进行筛选。

    I lastItem = items.get(items.size() - 1);
    List<I> result = items.stream().filter( item -> item.equals(lastElement) || !condition(item)).collect(Collectors.toList());