2017-03-31 65 views
0
public class Emp { 

    public String name; 
    public String department; 
    public double salary; 

    public Emp(String name, String department, double salary) { 

     this.name = name; 
     this.department = department; 
     this.salary = salary; 
    } 
} 
  1. 所以我想總結的工資來獲得前5名的部門和
  2. 也試圖前5名員工在部門說銷售

我如何在Java 8使用GROUPBY然後求和和排序如何使用GROUPBY /λ

這是我的數據有

Emp("Michael", "Sales",20000.0) Emp("Jean","Marketing",250000.0) Emp("Jason","Biz-dev",220000.0) ..........

+2

我想你需要寫一些代碼。 –

+0

你的問題不明確。 –

+0

如果我沒有弄錯,你基本上想以高薪將這些部門分組,然後進入前五名? –

回答

3

前5個部門的總薪水:

List<String> top5Departments = employees.stream() 
    .collect(Collectors.groupingBy(e -> e.department, 
       Collectors.summingDouble(e -> e.salary))) 
    .entrySet() 
    .stream() 
    .sorted(Map.Entry.comparingByValue().reversed()) 
    .limit(5) 
    .map(Map.Entry::getKey) 
    .collect(Collectors.toList()); 

前5名員工通過工資在一個特定的部門:

List<Emp> top5SalesEmployees = employees.stream() 
    .filter(e -> "sales".equals(e.department)) 
    .sorted(Comparator.comparingDouble(e -> e.salary).reversed()) 
    .limit(5) 
    .collect(Collectors.toList()); 
+1

正如我所說的,可怕的是非高性能。 –

1

我想過直接投入一個Map通過數值支持順序。 jdk中不存在這樣的事情,但例如在guava中。所以,你的解決方案可以這個樣子:

Map<String, Double> map = employees.stream().collect(
      Collectors.collectingAndThen(Collectors.groupingBy(Emp::getDepartment, 
        Collectors.summingDouble(Emp::getSalary)), 
        x -> ImmutableMap.<String, Double> builder() 
          .putAll(x) 
          .orderEntriesByValue(Comparator.comparing((Double d) -> d).reversed()) 
          .build())); 

    map.entrySet().stream().map(Map.Entry::getValue).limit(5).forEach(System.out::println); 

這是則已經提供的解決方案不更好,這只是一些可以這樣做。