如何在过滤器中的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;
});
使用 filter
和 Java8
的 map
,你可以这样做:
employees.stream()
.filter(e -> e.getFirstName().equalsIgnoreCase("Raj"))
.map(e -> {
e.setEmail(null);
return e;
}).findAny();