Java 8中是否存在如何在最小大小条件下从列表中删除项目?

Spe*_*ise -1 java java-8 java-stream

我想从列表中删除一个项目,如果它不是集合中的最后一个.

例如:

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

是否可以通过在Java 8中使用流以更优雅的方式执行相同的操作?

GBl*_*ett 5

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

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

给定谓词是项目满足条件的位置.但是,您需要首先确保不会删除所有项目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));
}
Run Code Online (Sandbox Code Playgroud)

或者为了确保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);
}
Run Code Online (Sandbox Code Playgroud)

(感谢@Holger的建议)