Stream 类型中的方法筛选器(谓词<?超级员工>)<Employee>不适用于参数((<无类型> e) -> {})



如何在过滤器中的Java 8中设置值?我想将电子邮件设置为null,那里的名称为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);
            }
        }).
    }
}

滤波器方法应返回 boolean,我认为不应该有任何副作用。在您的情况下,简单循环将完成工作:

for(Employee employee: employees) {
    if(e.getFirstName().equals("Raj")) {
        e.setEmail(null);
    }
}

但是,如果您真的想使用流:

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

或(如果您想对整个列表进行处理并使用所有条目进行更改:

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

我们还可以使用 Collectors.mapping 检查firstName是否为Raj,然后将email设置为映射函数(1ST参数)中的CC_5,然后将其收集在新的List(第二参数):

employees.stream().collect(Collectors.mapping(emp -> {
          if("Raj".equals(emp.getFirstName())) {
              emp.setEmail(null); 
          } 
          return emp;
          }, Collectors.toList()));

正如无效的,请勿突变流中的对象。您可以使用复制构造函数将Employee的副本作为firstName作为Raj 并将email属性设置为null

employees.stream().collect(Collectors.mapping(emp -> {
          if("Raj".equals(emp.getFirstName())) {
              return new Employee(emp.getFirstName(), emp.getLastName(), null);
          }
          return emp;
          }, Collectors.toList()));

您可以使用List.replaceAll AS:

employees.replaceAll(employee -> {
    if (employee.getFirstName().equals("Raj")) {
        employee.setEmail(null);
    }
    return employee;
});

使用 filterJava8map,你可以这样做:

employees.stream()
         .filter(e -> e.getFirstName().equalsIgnoreCase("Raj"))
         .map(e -> {
              e.setEmail(null);
              return e;
       }).findAny();