Метод фильтра (Предикат) в типе Stream <Employee>не применимо для аргументов ((д) -> {}) - PullRequest
3 голосов
/ 06 марта 2019

Как установить значения в Java 8 в фильтре?Я хочу установить emailId на ноль, где 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);
            }
        }).
    }
}

Ответы [ 4 ]

3 голосов
/ 06 марта 2019

Метод фильтра должен возвращать 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());
2 голосов
/ 06 марта 2019

Мы также можем использовать Collectors.mapping, чтобы проверить, является ли firstName значение Raj, а затем установить email на null в функции отображения (1-й аргумент), а затем соберите его в новом List (2-й аргумент):

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

И, как подсказывает nullpointer, не изменяйте объекты в потоке. Вы можете использовать конструктор копирования, чтобы сделать копию 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()));
1 голос
/ 06 марта 2019

С другой стороны, вы можете использовать List.replaceAll как:

employees.replaceAll(employee -> {
    if (employee.getFirstName().equals("Raj")) {
        employee.setEmail(null);
    }
    return employee;
});
0 голосов
/ 06 марта 2019

Используя filter и map из Java8, вы можете сделать это следующим образом:

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