Java Int Streams - PullRequest
       7

Java Int Streams

0 голосов
/ 30 сентября 2018

Я довольно новый Java-программист, и в настоящее время я изучаю потоки.Я пытаюсь использовать поток, чтобы взять зарплаты от каждого отдела и усреднить их.Я был в состоянии добавить зарплаты или усреднить их, но я не могу понять, как я буду делать это по отделам.Вот код, который у меня есть.

 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;


public class AverageSalariesDept {

public static void main(String[] args) {


  Employee[] employees = {
     new Employee("Jason", "Red", 5000, "IT"),
     new Employee("Ashley", "Green", 7600, "IT"),
     new Employee("Matthew", "Indigo", 3587.5, "Sales"),
     new Employee("James", "Indigo", 4700.77, "Marketing"),
     new Employee("Luke", "Indigo", 6200, "IT"),
     new Employee("Jason", "Blue", 3200, "Sales"),
     new Employee("Wendy", "Brown", 4236.4, "Marketing")};


  List<Employee> list = Arrays.asList(employees);

  Function<Employee, String> byDepartment = Employee::getDepartment;
  Function<Employee, Double> bySalary = Employee::getSalary;

  Comparator<Employee> compSalaries = 
  Comparator.comparing(byDepartment).thenComparing(bySalary);

  list.stream()
           .sorted(compSalaries)  
           .forEach(System.out::println);


   System.out.printf("Average of Employees' salaries: %.2f%n",
     list.stream()
         .mapToDouble(Employee::getSalary)
         .average()
         .getAsDouble());



 }
 }

1 Ответ

0 голосов
/ 30 сентября 2018

Это то, что вам нужно.

Map<String, Double> avgSalByDept = Arrays.stream(employees).
    collect(Collectors.groupingBy(Employee::getDepartment, 
        Collectors.averagingDouble(Employee::getSalary)));

Сначала используйте коллектор groupingBy для группировки Employees по отделам.Затем используйте нижестоящий collector, чтобы вычислить среднюю зарплату для каждого отдела / группы.

...