Статьи

Примеры Java 8 Stream

Этот пост поможет вам понять некоторые важные и часто используемые операции 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, являются их собственными.