Stream<Employee> 类型中的方法 filter(Predicate<? super Employee>) 不适用于参数 ((<no type> e) -> {})

PAA*_*PAA 5 java java-8 java-stream

如何在 Java 8 中设置过滤器中的值?我想将 emailId 设置为 null,其中firstName 是 Raj。我怎样才能在Java8中做到这一点?

public class EmployeeDemo {
    public static void main(String[] args) {
        Employee e1 = new Employee("John", "Kerr", "john.kerr@gmail.com");
        Employee e2 = new Employee("Parag", "Rane", "john.kerr@gmail.com");
        Employee e3 = new Employee("Raj", "Kumar", "john.kerr@gmail.com");
        Employee e4 = new Employee("Nancy", "Parate", "john.kerr@gmail.com");

        List<Employee> employees = new ArrayList<>();
        employees.add(e1);
        employees.add(e2);
        employees.add(e3);
        employees.add(e4);

        employees.stream().filter(e -> {
            if(e.getFirstName().equals("Raj")) {
                e.setEmail(null);
            }
        }).
    }
}
Run Code Online (Sandbox Code Playgroud)

Bye*_*Bye 4

Filter 方法应该返回boolean,我认为不应该有任何副作用。在你的情况下,简单的循环就可以完成这项工作:

for(Employee employee: employees) {
    if(e.getFirstName().equals("Raj")) {
        e.setEmail(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果你真的想使用流:

employees.stream() //get stream
    .filter(e -> e.getFirstName().equals("Raj")) //filter entries with first name Raj
    .forEach(e -> e.setEmail(null)); //for each of them set email to null
Run Code Online (Sandbox Code Playgroud)

或者(如果您想处理整个列表并返回更改的所有条目:

employees.stream() //get stream
    .map(e -> {
        if(e.getFirstName().equals("Raj")) {
            e.setEmail(null);
        }
        return e;
    })
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)