У меня есть сценарий использования, когда у меня есть все данные о сотрудниках в списке (List<Employee> employeesList
), и я хотел бы получить требуемых сотрудников, предоставив другой список идентификаторов сотрудников (List<String> employeeIdList
). Мне нужен тот же порядок employeeIdList
для сотрудников после поиска.
Я могу добиться этого с помощью обычной вложенности для l oop, но я хотел бы проверить, как лучше всего добиться этого с помощью Java потоков.
Используя обычные потоки, я не получаю правильный порядок, поэтому я попытался проверить условие во время итерации и добавил в другой список, но мне все еще нужно собрать объекты, которые я на самом деле нигде не использую.
Есть ли другой лучший вариант для достижения этой функциональности. Любая помощь приветствуется.
Ниже приведен пример кода.
package com.test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
/**
* The Class SimpleClass.
*/
public class SimpleClass {
/**
* The main method.
*
* @param args the arguments
*/
public static void main(String[] args) {
Employee employee1 = new Employee("1", "Employee 1");
Employee employee2 = new Employee("2", "Employee 2");
Employee employee3 = new Employee("3", "Employee 3");
Employee employee4 = new Employee("4", "Employee 4");
Employee employee5 = new Employee("5", "Employee 5");
List<Employee> employeesList = new LinkedList<>();
employeesList.add(employee5);
employeesList.add(employee1);
employeesList.add(employee2);
employeesList.add(employee3);
employeesList.add(employee4);
List<String> neededEmployees = new LinkedList<>();
neededEmployees.add("4");
neededEmployees.add("1");
neededEmployees.add("5");
/* Nested For Loop */
List<Employee> requiredEmployeesList = new LinkedList<>();
for (String employeeId : neededEmployees) {
for (Employee employee : employeesList) {
if (employee.getId().equals(employeeId)) {
requiredEmployeesList.add(employee);
}
}
}
printEmployeeDetails(requiredEmployeesList);
/* Using Streams - Not returning the required order */
List<Employee> employeesListNew = employeesList.stream().filter(
employee -> neededEmployees.stream().anyMatch(employeeId -> employeeId.equals(employee.getId())))
.collect(Collectors.toList());
printEmployeeDetails(employeesListNew);
/* Using Streams - adding to a different list based on condition - This provides the right order as required*/
List<Employee> sortedEmployeesList = new ArrayList<>();
neededEmployees.stream()
.filter(employeeId -> employeesList.stream()
.anyMatch(employee -> employee.getId().equals(employeeId) ? sortedEmployeesList.add(employee) : false))
.collect(Collectors.toList());
printEmployeeDetails(sortedEmployeesList);
}
/**
* Prints the employee details.
*
* @param employeesList the employees list
*/
private static void printEmployeeDetails(List<Employee> employeesList) {
System.out.println("Printing Employees List");
for (Employee employee : employeesList) {
System.out.println(employee.getId());
System.out.println(employee.getName());
}
}
}
class Employee {
String id;
String name;
// Setter, Getter and AllArgsConstructor
}