Java8 stream 中利用 groupingBy 進行多字段分組求和

Java8的groupingBy實現集合的分組,相似Mysql的group by分組功能,注意獲得的是一個mapjava

對集合按照單個屬性分組

case1:sql

List<String> items = Arrays.asList("apple", "apple", "banana", "apple", "orange", "banana", "papaya"); // 分組
Map<String, List<String>> result1 = items.stream().collect( Collectors.groupingBy( Function.identity() ) ); //{papaya=[papaya], orange=[orange], banana=[banana, banana], apple=[apple, apple, apple]}
System.out.println(result1); // 分組計數
Map<String, Long> result2 = items.stream().collect( Collectors.groupingBy( Function.identity(), Collectors.counting() ) ); // {papaya=1, orange=1, banana=2, apple=3}
System.out.println(result2); Map<String, Long> finalMap = new LinkedHashMap<>(); //分組, 計數和排序
result2.entrySet().stream() .sorted(Map.Entry.<String, Long>comparingByValue().reversed()) .forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue())); // {apple=3, banana=2, papaya=1, orange=1}
System.out.println(finalMap);

case2:app

User user1 = new User("zhangsan", "beijing", 10); User user2 = new User("zhangsan", "beijing", 20); User user3 = new User("lisi", "shanghai", 30); List<User> list = new ArrayList<User>(); list.add(user1); list.add(user2); list.add(user3); Map<String, List<User>> collect = list.stream() .collect( Collectors.groupingBy( User::getName/*, Collectors.counting()*/ ) ); //{lisi=[User{age=30, name='lisi', address='shanghai'}], // zhangsan=[User{age=10, name='zhangsan', address='beijing'}, User{age=20, name='zhangsan', address='beijing'}]}
System.out.println(collect);

集合按照多個屬性分組

1.多個屬性拼接出一個組合屬性

public static void main(String[] args) { User user1 = new User("zhangsan", "beijing", 10); User user2 = new User("zhangsan", "beijing", 20); User user3 = new User("lisi", "shanghai", 30); List<User> list = new ArrayList<User>(); list.add(user1); list.add(user2); list.add(user3); Map<String, List<User>> collect = list.stream().collect(Collectors.groupingBy(e -> fetchGroupKey(e))); //{zhangsan#beijing=[User{age=10, name='zhangsan', address='beijing'}, User{age=20, name='zhangsan', address='beijing'}], // lisi#shanghai=[User{age=30, name='lisi', address='shanghai'}]}
 System.out.println(collect); } private static String fetchGroupKey(User user){ return user.getName() +"#"+ user.getAddress(); }

2.嵌套調用groupBy

不過感受這樣把問題搞複雜了ide

User user1 = new User("zhangsan", "beijing", 10); User user2 = new User("zhangsan", "beijing", 20); User user3 = new User("lisi", "shanghai", 30); List<User> list = new ArrayList<User>(); list.add(user1); list.add(user2); list.add(user3); Map<String, Map<String, List<User>>> collect = list.stream().collect( Collectors.groupingBy( User::getAddress, Collectors.groupingBy(User::getName) ) ); System.out.println(collect);

Ref:fetch

https://stackoverflow.com/questions/28342814/group-by-multiple-field-names-in-java-8#spa

相關文章
相關標籤/搜索