Получить один объект из списка с помощью API потока java8

У меня есть список Employee, и я хочу получить только одну информацию о Employee с определенным именем:

public static Employee getAllEmployeeDetails(String employeeName) {
    List<Employee> empList = getAllEmployeeDetails();
    Employee employee = empList.stream().filter(x -> x.equals(employeeName));
    return employee;
}

Пожалуйста, дайте мне знать, как отфильтровать данные и вернуть один элемент.

Я предлагаю переименовать ваш метод в getEmployeeByName вместо getAllEmployeeDetails. читабельность очень важна.

Ousmane D. 11.12.2018 10:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
1
13 338
3

Ответы 3

Это найдет первый Employee, соответствующий данному имени, или null, если он не найден:

Employee employee = empList.stream()
                           .filter(x -> x.getName().equals(employeeName))
                           .findFirst()
                           .orElse(null);

Вы ищете findFirst или findAny:

empList.stream()
       .filter(x -> x.getName().equals(employeeName))
.findFirst()

или

empList.stream()
       .filter(x -> x.getName().equals(employeeName))
.findAny();

Однако я бы предложил изменить тип возвращаемого значения метода с помощью Optional, который предназначен для использования в качестве типа возвращаемого значения метода, где необходимо указать «нет результата». другими словами, мы позволяем «клиенту» решать, что делать в случае «отсутствия значения». т.е.

public static Optional<Employee> getAllEmployeeDetails(String employeeName) {
       return empList.stream()
           .filter(x -> x.getName().equals(employeeName))
          .findFirst()
}

вы могли бы использовать .findFirst().orElse(null), но работа с nullity иногда бывает опасной, и это прекрасная возможность использовать API Optional<T>.

Ага, это действительно хороший совет: отбросьте нули, верните Optionals.

MC Emperor 11.12.2018 08:23

а может orElseThrow, если критично получить на базе employeeName, мысли?

Naman 11.12.2018 09:33

@nullpointer хороший крик! Я должен сказать, что это зависит и является спорным, но лично я придерживался предложенного подхода, потому что он предоставляет больше возможностей для клиента, а сигнатура метода с дополнительным типом возврата очень значима / удобочитаема.

Ousmane D. 11.12.2018 10:17

Привет, вы можете использовать несколько способов получить один объект из списка здесь, я просто изменил имена методов, а также некоторые имена переменных, чтобы код был читабельным, а также попытаться использовать Optional, поскольку он обрабатывает нулевой указатель

  public static Employee findEmployeeByName(String employeeName) {
    List<Employee> empList = getAllEmployeeDetails();
    Optional<Employee> employee = empList.stream()
            .filter(employee -> employee.getName().equalsIgnoreCase(employeeName))
            .findFirst();
    return employee.isPresent() ? employee.get() : null; // Instead of null you can also return empty Employee Object
}

Другие вопросы по теме