java stream filter limit group by
原创 echojava 发表于:2022-05-28 15:13:09
  阅读 :133   收藏   编辑

看下面这段代码就可以了

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.*;
import java.util.stream.Collectors;

public class ListStreamGroup {
  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  static class Bean {
    private Long id;
    private String name;
    private String city;
    private Integer age;
  }


  public static void main(String[] args){
      List<Bean> data = Arrays.asList(
          new Bean(1L, "张三", "上海", 10),
          new Bean(2L, "娄底市", "厦门", 20),
          new Bean(3L, "李冬梅", "北京", 40),
          new Bean(4L, "豪礼", "深圳", 12),
          new Bean(5L, "oil", "北京", 43),
          new Bean(6L, "没道理", "上海", 13),
          new Bean(7L, "史蒂夫", "深圳", 56),
          new Bean(8L, "aaron", "北京", 78)
      );
    // 根据stream过滤年龄大于18岁,按地区分组,取前5名
    Map<String, Long> topInfoMap = new LinkedHashMap<>();
      data.stream()
          .filter(e -> e.getAge() > 18)
          .collect(Collectors.groupingBy(e -> e.getCity(), Collectors.counting()))
          .entrySet()
          .stream()
          .forEachOrdered(e -> topInfoMap.put(e.getKey(), e.getValue()));

    String message = topInfoMap.entrySet().stream()
        .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
        .limit(5)
        .map(entry -> String.format("%s count: %s", entry.getKey(), entry.getValue())).collect(Collectors.joining("\n"));

      System.out.println(message);
    }
}

image.png