Этот пост поможет вам понять некоторые важные и часто используемые операции Stream в Java 8, которые облегчают ваше программирование на Java.
Давайте возьмем наш традиционный пример, сотрудник и отдел.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
public class Employee { private String name; private Integer age; private String city; private Department department; public Employee(String name, Integer age, String city, Department department) { this .name = name; this .age = age; this .city = city; this .department = department; } // getters and setters. } |
01
02
03
04
05
06
07
08
09
10
11
12
13
|
public class Department { private String departmentName; private Integer noOfEmployees; public Department(String departmentName, Integer noOfEmployees) { this .departmentName = departmentName; this .noOfEmployees = noOfEmployees; } // getters and setters } |
Ниже приведен пример набора данных для демонстрации некоторых важных функций интерфейса Java 8 Stream. У нас есть четыре отдела и набор сотрудников из этих отделов.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
Department account = new Department( "Account" , 75 ); Department hr = new Department( "HR" , 50 ); Department ops = new Department( "OP" , 25 ); Department tech = new Department( "Tech" , 150 ); List<Employee> employeeList = Arrays.asList( new Employee( "David" , 32 , "Matara" , account), new Employee( "Brayan" , 25 , "Galle" , hr), new Employee( "JoAnne" , 45 , "Negombo" , ops), new Employee( "Jake" , 65 , "Galle" , hr), new Employee( "Brent" , 55 , "Matara" , hr), new Employee( "Allice" , 23 , "Matara" , ops), new Employee( "Austin" , 30 , "Negombo" , tech), new Employee( "Gerry" , 29 , "Matara" , tech), new Employee( "Scote" , 20 , "Negombo" , ops), new Employee( "Branden" , 32 , "Matara" , account), new Employee( "Iflias" , 31 , "Galle" , hr)); |
Найдите всех сотрудников, которые живут в городе Матара, отсортируйте их по имени и напечатайте имена сотрудников.
1
2
3
4
|
employeeList.stream() .filter(e -> e.getCity().equalsIgnoreCase( "Matara" )) .sorted(Comparator.comparing(Employee::getName)) .forEach(e -> System.out.println(e.getName())); |
Найдите различные названия отделов, на которые работают сотрудники.
1
2
3
4
|
employeeList.stream() .map(e -> e.getDepartment().getDepartmentName()) .distinct() .forEach(System.out::println); |
Найдите названия отделов, в которых работают эти сотрудники, где число сотрудников в отделе превышает 50.
1
2
3
4
5
|
employeeList.stream() .map(Employee::getDepartment) .filter(d -> d.getNoOfEmployees() > 50 ) .distinct() .forEach(d -> System.out.println(d.getDepartmentName())); |
Создайте запятую отдельную строку названий отделов, отсортированных по алфавиту.
1
2
3
4
5
6
|
String s = employeeList.stream() .map(e -> e.getDepartment().getDepartmentName()) .distinct() .sorted() .reduce( "" , (a, b) -> (a + "," + b)); System.out.println(s); |
Есть ли сотрудники отдела кадров?
1
2
3
4
|
if (employeeList.stream() .anyMatch(e -> e.getDepartment().getDepartmentName().equalsIgnoreCase( "HR" ))) { System.out.println( "Found employees frm HR department" ); } |
Напечатайте все имена сотрудников, которые работают в бухгалтерии.
1
2
3
4
|
employeeList.stream() .filter(e -> e.getDepartment().getDepartmentName().equalsIgnoreCase( "Account" )) .map(Employee::getName) .forEach(System.out::println); |
Какова наибольшая численность работников во всех отделах?
1
2
3
4
|
employeeList.stream() .map(e -> e.getDepartment().getNoOfEmployees()) .reduce(Integer::max) .ifPresent(System.out::print); |
Найдите отдел, который имеет наибольшее количество сотрудников.
1
2
3
4
|
employeeList.stream() .map(Employee::getDepartment) .reduce( (d1, d2) -> d1.getNoOfEmployees() > d2.getNoOfEmployees() ? d1 : d2) .ifPresent(d -> System.out.println(d.getDepartmentName())); |
То же самое можно сделать следующим образом, используя метод max ().
1
2
3
4
|
employeeList.stream() .map(Employee::getDepartment) .max(Comparator.comparing(Department::getNoOfEmployees)) .ifPresent(d -> System.out.println(d.getDepartmentName())); |
Найти общее количество сотрудников во всех отделах.
1
2
3
|
employeeList.stream() .map(e -> e.getDepartment().getNoOfEmployees()) .distinct().reduce(Integer::sum).ifPresent(System.out::println); |
Опубликовано на Java Code Geeks с разрешения Семики Калуге, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Примеры Java 8 Stream
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |