Как передавать и собирать методы экземпляра в результате сбора объекта? - PullRequest
4 голосов
/ 04 апреля 2019

Требуется потоковая передача набора объектов, фильтрация по некоторым критериям и сбор только employeeID в наборе строк

class Employee {
    private String empId;
    private int type;

    public int getType() {
        return type;
    }

    public String getEmpId() {
        return empId;
    }
}

При фильтрации следующего утверждения

employees.stream().filter(x-> x.getType() == 1).collect(Collectors.toSet());

возвращает Set<Employee> вместо этого я хочу собрать только empId, т.е. Set<String>

Примечание. Невозможно сделать переменную экземпляра ничем, кроме private.

Ответы [ 3 ]

2 голосов
/ 04 апреля 2019

Используйте map() для сопоставления экземпляров Employee с соответствующими идентификаторами сотрудников.

Set<String> empIds =
    employees.stream()
             .filter(x-> x.getType() == 1)
             .map(Employee::getEmpId)
             .collect(Collectors.toSet());
2 голосов
/ 04 апреля 2019
employees
   .stream()
   .filter(x-> x.getType() == 1)
   .map(Employee::getEmpId)
   .collect(Collectors.toSet());

вернет Set<String>, которые содержат идентификаторы сотрудников.

1 голос
/ 04 апреля 2019

Если вам также нужен оригинальный Employee, вы можете вместо этого использовать toMap.

Map<String, Employee> employeesById = employees.stream()
        .filter(e-> e.getType() == 1)
        .collect(Collectors.toMap(Employee::getEmpId, Function.identity()));

Это особенно полезно, если вам нужно разрешить сотрудников позже. Если это не применимо, вышеупомянутые решения должны быть предпочтительными.

Кроме того, Set все еще можно получить с помощью:

Set<String> employeeIds = employeesById.keySet();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...