Как удалить элементы из списка, если условие минимального размера присутствует в Java 8? - PullRequest
0 голосов
/ 29 октября 2018

Я хочу удалить элемент из списка только в том случае, если он не последний в коллекции.

Например:

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

Можно ли сделать то же самое более элегантно, используя потоки в Java 8?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы можете получить последний элемент списка и отфильтровать, когда последний элемент и условие не выполнено.

I lastItem = items.get(items.size() - 1);
List<I> result = items.stream().filter( item -> item.equals(lastElement) || !condition(item)).collect(Collectors.toList());   
0 голосов
/ 29 октября 2018

Если вам нужно удалить элементы на основе условия, если это не последний элемент в списке, который вы можете использовать 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));
}

Или чтобы убедиться, что 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 за предложение)

...