Java 8 - Collection.removeIf

在Java8中,java.util.Collection接口提供了一个新的方法,Collection.removeIf(),用于根据条件删除集合中的元素,它的出现,可以代替Java8之前使用iterator遍历删除的写法。

为了理解引入此方法的意图,我们首先看看在java7中如何从Collection中删除元素

在此之前先创建一个实体类:

public class Employee {
    private String name;
    private Integer age;
    private Double salary;
    public Employee(String name, Integer age, Double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    @Override
    public String toString(){
        return "Employee Name:"+this.name
                +"  Age:"+this.age
                +"  Salary:"+this.salary;
    }
    //...省略get、set等方法
}

在Java7中遍历删除的写法:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class CollectionRemoveIfExample {
    private static List<Employee> employeeList = new ArrayList<>();
    public static void main(String[] args) {
        employeeList.add(new Employee("关羽", 45, 7000.00));
        employeeList.add(new Employee("张飞", 25, 10000.00));
        employeeList.add(new Employee("赵云", 65, 8000.00));
        employeeList.add(new Employee("吕布", 22, 12000.00));
        employeeList.add(new Employee("马超", 29, 9000.00));
        
        Iterator<Employee> empIterator = employeeList.iterator();
        while(empIterator.hasNext()){
            Employee employee = empIterator.next();
            if(employee.getAge() >= 30){
                empIterator.remove();
            }
        }
        
        System.out.println("年龄小于30岁的员工:");
        employeeList.forEach(System.out::println);
    }
}

运行结果:

在IDEA中编写代码的话,IDEA会自动提示出此处遍历删除应该使用Collection.removeIf方法

Java 8的java.util.Collection接口添加了一个新默认方法removeIf()。方法签名为

default boolean removeIf(Predicate<? super E> filter)

使用Java8中Collection.removeIf方法

import java.util.ArrayList;
import java.util.List;
public class CollectionRemoveIfExample {
    private static List<Employee> employeeList = new ArrayList<>();
    public static void main(String[] args) {
        employeeList.add(new Employee("关羽", 45, 7000.00));
        employeeList.add(new Employee("张飞", 25, 10000.00));
        employeeList.add(new Employee("赵云", 65, 8000.00));
        employeeList.add(new Employee("吕布", 22, 12000.00));
        employeeList.add(new Employee("马超", 29, 9000.00));
        
        employeeList.removeIf((Employee emp) -> emp.getAge() >= 30);
        
        System.out.println("年龄小于30岁的员工:");
        employeeList.forEach(System.out::println);
    }
}

运行结果与Java7中写法完全运行结果完全相同。