Я считаю, что это более эффективно, чем сортировка всего списка, потому что это O (n) для ArrayList
s.
Вы можете найти все объекты, соответствующие этому предикату, и перейти к закончить с этим. Метод удаления вызывается с индексом, а не с самим объектом, так что список не должен go снова проходить через него внутри, если это ArrayList
, а не LinkedList
. Этот первый более краток, но довольно неэффективен с несколькими объектами, как указал Хольгер.
IntStream.range(0, list.size())
.filter(i -> list.get(i).isMoveToLast())
.foreach(i -> list.add(list.remove(i)));
Другой способ сделать это, который немного более эффективен, но требует 2 строки вместо 1:
List<Item> newList = new ArrayList<>(list.size());
newList.addAll(
list.stream()
.filter(it -> it.isMoveToLast() || !newList.add(it))
.collect(Collectors.toList()));
Если вы хотите переместить только один объект в конец, вы также можете сделать
IntStream.range(0, list.size())
.filter(i -> list.get(i).isMoveToLast())
.findFirst()
.ifPresent(i -> list.add(list.remove(i)));
Это приведет к короткому замыканию, а не go по всему списку, если он найдет объект, на котором он ищу.
Для LinkedList
вы могли бы это сделать, но это не требует Java 8:
Iterator<Item> iter = list.iterator();
List<Item> toAdd = new ArrayList<>();
while (iter.hasNext()) if (iter.next().isMoveToLast()) toAdd.add(iter.remove());
for (Item it : toAdd) list.add(it);