jdk8對list進行分組操作


 

1. 數據准備:

public class TestGroupBy { @Data public static class User { private Integer id; private Integer schoolId; private String userName; private String edu; private double price; } public static List<TestListToMap.User> users = new ArrayList<>(); static { TestListToMap.User u1 = new TestListToMap.User(); u1.setId(1001); u1.setSchoolId(100); u1.setUserName("小1"); u1.setEdu("001"); u1.setPrice(0.01); TestListToMap.User u2 = new TestListToMap.User(); u2.setId(1002); u2.setSchoolId(100); u2.setUserName("小2"); u2.setEdu("002"); u2.setPrice(0.20); TestListToMap.User u3 = new TestListToMap.User(); u3.setId(2010); u3.setSchoolId(200); u3.setUserName("小3"); u3.setEdu("001"); u3.setPrice(3.00); TestListToMap.User u4 = new TestListToMap.User(); u4.setId(3001); u4.setSchoolId(300); u4.setEdu("001"); u4.setPrice(40.0); users.add(u1); users.add(u2); users.add(u3); users.add(u4); } } 

對List進行分組,也可以理解為將List轉換為Map集合。

若想將返回的結果映射為不同的集合。

    public static void main(String[] args) { List<String> lists=new ArrayList<>(); lists.add("a"); lists.add("b"); lists.add("a"); lists.add("a"); //將最終結果映射為LinkedHashSet結構。 LinkedHashSet<String> collect = lists.stream(). collect(Collectors.toCollection(LinkedHashSet::new)); System.out.println(collect); } 

2. group by的重載方法

group by生成一個擁有分組功能的Collector,有三個重載方法。

  1. 需要一個參數:按照該參數進行分組。結果返回一個Map集合,每個Map的key默認是分組參數的類型,value是一個List集合。
public void test1() { Map <String,List < User >> collect = users.stream().collect(Collectors.groupingBy(User: :getEdu)); } 
  1. 需要兩個參數:第二參數是Collector類型,可以對value進行處理。

2.1 可以對結果進行映射

public void test2() { Map <String,List <Integer>> collect = users.stream().collect(Collectors.groupingBy(User: :getEdu, //第二個參數對Map的value進行處理(映射) Collectors.mapping(User: :getId, Collectors.toList()))); } 

2.2 可以對結果進行求和

public static void test3() { Map <String,Double> collect = users.stream().collect(Collectors.groupingBy(User: :getEdu, //對參數進行累計求和 Collectors.summingDouble(User: :getPrice))); System.out.println(collect); } 

2.3 對結果的統計

public static void test4() { Map < String,Long > collect = users.stream().collect(Collectors.groupingBy(User: :getEdu, //獲取count數量 Collectors.counting())); System.out.println(collect); } 
  1. 需要三個參數,第三個參數添加了對結果Map的生成方式,默認是HashMap
public static void test3() { Map <String,Double > collect = users.stream().collect(Collectors.groupingBy(User: :getEdu, //決定map的生成方式,使用TreeMap TreeMap: :new, //對參數進行累計求和 Collectors.summingDouble(User: :getPrice))); System.out.println(collect); }


作者:小胖學編程
鏈接: https://www.jianshu.com/p/60390d9c3301/
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM