今天偶然间发现了Collection在1.8新增了一个removeIf(Predicate<? super E> filter)方法,能够实现面试官们常问的:如何一边遍历,一边删除。
首先是源码
/*** Removes all of the elements of this collection that satisfy the given* predicate. Errors or runtime exceptions thrown during iteration or by* the predicate are relayed to the caller.** @implSpec* The default implementation traverses all elements of the collection using* its {@link #iterator}. Each matching element is removed using* {@link Iterator#remove()}. If the collection's iterator does not* support removal then an {@code UnsupportedOperationException} will be* thrown on the first matching element.** @param filter a predicate which returns {@code true} for elements to be* removed* @return {@code true} if any elements were removed* @throws NullPointerException if the specified filter is null* @throws UnsupportedOperationException if elements cannot be removed* from this collection. Implementations may throw this exception if a* matching element cannot be removed or if, in general, removal is not* supported.* @since 1.8*/
default boolean removeIf(Predicate<? super E> filter) {Objects.requireNonNull(filter);boolean removed = false;final Iterator<E> each = iterator();while (each.hasNext()) {if (filter.test(each.next())) {each.remove();removed = true;}}return removed;}
源码中注释很长,但是相信大家就能看出新增方法的作用了。删除集合中满足给定条件的所有元素
接下来模拟需求是:筛选掉所有没给我点赞的用户
上代码:
import java.util.*;
import java.util.function.Predicate;public class Demo {Demo(){}class User{private int id;private String name;private boolean like;public User(){}public User(int id,String name,boolean like){this.id = id;this.name = name;this.like = like;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public boolean getLike() {return like;}public void setLike(boolean like) {this.like = like;}@Overridepublic String toString(){return "User{" +"id=" + id +", name='" + name + '\'' +", like=" + like +'}';}}public static void main(String[] args) {Demo demo = new Demo();List<User> list = new ArrayList<>();list.add(demo.new User(1,"张三",true));list.add(demo.new User(2,"李四",false));list.add(demo.new User(3,"王五",true));list.add(demo.new User(4,"赵六",false));// 1.常规方式/* list.removeIf(new Predicate<User>(){@Overridepublic boolean test(User user){return false == user.getVip();}});*/// 2.使用lambda表达式(推荐)list.removeIf(user -> false == user.getLike());System.out.println(list.toString());}
}
[User{id=1, name=‘张三’, like=true}, User{id=3, name=‘王五’, like=true}]