Java 8 stream forEach filter anyMatch 符:去重,排序,過濾,分組,統計


forEach的循

someObjects.forEach(obj -> { //to do something })

如果這個循環的目標是找到匹配某個謂詞的第一個元素

Optional<SomeObject> result = someObjects.stream().filter(obj -> some_condition_met).findFirst();

 

如果你只是想知道集合中是否有一個元素的條件為真,你可以使用anyMatch:

boolean result = someObjects.stream().anyMatch(obj -> some_condition_met);

distinct()  :字符串去重



 
 
         
符 :jdk8對list的各種處理實例詳解,包括去重,排序,過濾,分組,統計


   /*
去重,去除重復對象(每個屬性的值都一樣的),需要注意的是要先重寫對象TestStreamModel的equals和hashCode方法*/ System.out.println("去重前:"+list); List<TestStreamModel> distinctList = list.stream().distinct().collect(Collectors.toList()); System.out.println("去重后:"+distinctList); /*排序,按id升續排列,如果要降續則改成:(a, b) -> b.getId() - a.getId(); a和b都是變量名(可以按自己意願取名字),都是list中的對象的實例*/ System.out.println("排序前:"+list); List<TestStreamModel> sortList = list.stream().sorted((a, b) -> a.getId() - b.getId()).collect(Collectors.toList()); System.out.println("排序后"+sortList); /*過濾,按照自己的需求來篩選list中的數據,比如我篩選出不及格的(小於60分)的人,t為實例*/ System.out.println("過濾后:"+list); List<TestStreamModel> filterList = list.stream().filter(t -> t.getScore() < 60).collect(Collectors.toList()); System.out.println("過濾后"+filterList); /*map, 提取對象中的某一元素,例子中我取的是每個人的name,注意list中類型對應,如果取的是id或者班級,就應該是integer類型*/ System.out.println("提取前:"+list); List<String> mapList = list.stream().map(t -> t.getName()).collect(Collectors.toList()); System.out.println("提取后:"+mapList); /*統計,統計所有人分數的和, 主要我設置的分數屬性是double類型的,所以用mapToDouble,如果是int類型的,則需要用mapToInt*/ double sum = list.stream().mapToDouble(t -> t.getScore()).sum(); int count = list.stream().mapToInt(t -> t.getId()).sum(); /*分組, 按照字段中某個屬性將list分組*/ Map<Integer, List<TestStreamModel>> map = list.stream().collect(Collectors.groupingBy(t -> t.getGrade())); System.out.println("按年級分組"+map); /*然后再對map處理,這樣就方便取出自己要的數據*/ for(Map.Entry<Integer, List<TestStreamModel>> entry : map.entrySet()){ System.out.println("key:"+entry.getKey()); System.out.println("value:"+entry.getValue()); } /*多重分組,先按年級分組,再按班級分組*/ Map<Integer/*年級id*/, Map<Integer/*班級id*/, List<TestStreamModel>>> groupMap = list.stream().collect(Collectors.groupingBy(t -> t.getGrade(), Collectors.groupingBy(t -> t.getClasses()))); System.out.println("按照年級再按班級分組:"+groupMap); System.out.println("取出一年級一班的list:"+groupMap.get(1).get(1)); /*多重分組,一般多重分組后都是為了統計,比如說統計每個年級,每個班的總分數*/ Map<Integer/*年級id*/, Map<Integer/*班級id*/, Double>> sumMap = list.stream().collect(Collectors.groupingBy(t -> t.getGrade(), Collectors.groupingBy(t -> t.getClasses(), Collectors.summingDouble(t -> t.getScore())))); System.out.println(sumMap); System.out.println("取出一年級一班的總分:"+sumMap.get(1).get(1)); /*stream是鏈式的,這些功能是可以一起使用的,例如:計算每個年級每個班的及格人數*/ Map<Integer/*年級*/, Map<Integer/*班級*/, Long/*人數*/>> integerMap = list.stream().filter(t -> t.getScore() >= 60).collect(Collectors.groupingBy(t -> t.getGrade(), Collectors.groupingBy(t -> t.getClasses(), Collectors.counting()))); System.out.println("取出一年級一班及格人數:"+integerMap.get(1).get(1));

 

原文鏈接:https://blog.csdn.net/qq_33142257/article/details/62891612


免責聲明!

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



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