#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-й элемент.