Как использовать Java 8 Stream API без метода сбора?

#java #java-stream

#java #java-stream

Вопрос:

У меня есть проблема, которую нужно решить, где я должен найти n-го сотрудника мужского пола из списка сотрудников, использующих java 8 streams, если ничего не найдено, возвращайте необязательный пустой.

 class Employee{
   private int id;
   private String name;
   private String gender;
   
  //getters and setters
}
  

Ниже приведен метод, который принимает список объектов Employee и целое число n, где n обозначает n-го сотрудника мужского пола, который должен быть возвращен, если он существует.

 Optional<Employee> nthMaleEmployee(List<Employee> employees, int n){

}
  

Ниже приведено мое решение вопроса с использованием java 8 streams и метода сбора.

 return employees.stream().filter((e)-> e.getGender().equalsIgnoreCase("male")).collect(Collectors.toList()).get(n-1);
  

Есть ли какое-либо решение с потоками, не использующими метод сбора? Моя проблема заключается в использовании потоков без использования метода сбора.

Комментарии:

1. Ознакомьтесь с методами skip и findFirst в потоке. docs.oracle.com/javase/8/docs/api/java/util/stream /… и docs.oracle.com/javase/8/docs/api/java/util/stream /…

2. Спасибо за ваш ответ.

3. Кроме того, подумайте, хотите ли вы, чтобы n было равно нулю или основывалось на единице. Программисты Java ожидают, что индексы будут основаны на нуле.

4. Лесяк на основе 0 или 1 не имеет никакого отношения к порядковому выбору списка. Если вам нужен 8th тот, n который должен быть 8 независимо, поэтому следует skip(n-1)

5. @WJS Верно обратное. Если вы пропустите n-1 , похоже, что индекс основан на 1. Если вы пропустите n , похоже, что индекс основан на 0. Я ожидаю, что параметр n в исходной подписи nthMaleEmployee(List<Employee> employees, int n) будет вести себя как индекс на основе нуля, поэтому n для достижения этого необходим пропуск.

Ответ №1:

Используйте метод skip, чтобы пропустить (n-1) элементы в списке, и метод findFirst выдаст вам n-й элемент.