java8如何根據(jù)list對象中的屬性過濾篩選
根據(jù)list對象中的屬性過濾篩選
代碼演示:
根據(jù)性別篩選出所有的女同學(xué)
@Data
class Student{
public Integer age;
public String name;
public String sex;
}
List<Student> students = new ArrayList<>();
Student student1 = new Student();
student1.setAge(18);
student1.setName("趙");
student1.setSex("男");
Student student2 = new Student();
student2.setAge(19);
student2.setName("錢");
student2.setSex("女");
Student student3 = new Student();
student3.setAge(20);
student3.setName("孫");
student3.setSex("女");
Collections.addAll(students,student1,student2,student3);
//根據(jù)條件過濾 出所有的女同學(xué)
List<Student> result = students.stream().filter(student -> student.getSex().equals("女")).collect(Collectors.toList());
System.out.println(result);執(zhí)行結(jié)果:
![]()
filter方法:
對流的過濾,將一個流轉(zhuǎn)換成另一個子集流
list根據(jù)對象某個字段或多個字段去重、篩選、List轉(zhuǎn)Map、排序、分組、統(tǒng)計計數(shù)等
我們利用 java8 的新特性,可以方便簡潔高效的處理一些集合的數(shù)據(jù)。
簡單示例如下
先定義一個訂單對象(Order)
public class Order {?
? ? private Long id;
? ? private Long userId;
? ? private String num;
? ? private String type;
? ? private Float allAmt;
? ? private Float payAmt;
? ? private Integer orderNum;
?
? ? public Order(Long id, Long userId, String num, String type, Float allAmt, Float payAmt, Integer orderNum) {
? ? ? ? this.id = id;
? ? ? ? this.userId = userId;
? ? ? ? this.num = num;
? ? ? ? this.type = type;
? ? ? ? this.allAmt = allAmt;
? ? ? ? this.payAmt = payAmt;
? ? ? ? this.orderNum = orderNum;
? ? }
? ? // getting... ?setting...
}過濾篩選
List<Order> orders = Lists.newArrayList(); ?? // 篩選總金額大于1000的訂單 orders = orders.stream().filter(item -> item.getAllAmt() > 1000.00f).collect(Collectors.toList());
分組
List<Order> orders = Lists.newArrayList(); ?? // 按照訂單類型分組 Map<String, List<Order>> orderGroupMap = orders.stream().collect(Collectors.groupingBy(Order::getType));
去重
List<Order> orders = Lists.newArrayList(); ?? // 按照訂單編號去重 orders = orders.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ? ? ? ? ? -> new TreeSet<>(Comparator.comparing(Order::getNum))), ArrayList::new)); ? // 按照訂單編號和類型去重 orders = orders.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ? ? ? ? ? -> new TreeSet<>(Comparator.comparing(o -> o.getNum() + ";" + o.getType()))), ArrayList::new));
List 轉(zhuǎn) Map
List<Order> orders = Lists.newArrayList(); ?? // 將訂單集合轉(zhuǎn)換成訂單編號-應(yīng)付金額 map,注意訂單編號作為 key 不能重復(fù),應(yīng)先做去重處理 Map<String, Float> numPayMap = orders.stream().collect(Collectors.toMap(Order::getNum, Order::getPayAmt)); ? // 用 id 做 key 將 List 轉(zhuǎn)成 Map Map<Long, Order> orderMap = orders.stream().collect(Collectors.toMap(Order::getId, item -> item));
排序
List<Order> orders = Lists.newArrayList(); ?? ? // 按照訂單總金額從高到低排序 ? // 方式一 ? orders.sort((o1, o2) ? ? ? ? ? -> o1.getAllAmt() == null ? 1 : (o2.getAllAmt() == null ? -1 : o2.getAllAmt().compareTo(o1.getAllAmt()))); ? ? // 方式二 ? orders.sort(Comparator.comparing(Order::getAllAmt, (o1, o2) ? ? ? ? ? -> o1 == null ? 1 : (o2 == null ? -1 : o2.compareTo(o1)))); ? ? // 方式三 (allAmt 字段不能為 null, null 會導(dǎo)致排序失敗) ? orders.sort(Comparator.comparing(Order::getAllAmt).reversed()); ? ? // 先按照訂單類型排序,再按照訂單應(yīng)付金額從高到低排序 ? orders.sort(Comparator.comparing(Order::getType, (o1, o2) ? ? ? ? ? -> o1 == null ? 1 : (o2 == null ? -1 : o1.compareTo(o2))).thenComparing((o1, o2) ? ? ? ? ? -> o1.getPayAmt() == null ? 1 : (o2.getPayAmt() == null ? -1 : o2.getPayAmt().compareTo(o1.getPayAmt()))));
統(tǒng)計計數(shù)
List<Order> orders = Lists.newArrayList(); ?? ? // 統(tǒng)計所有訂單的總金額 ? // 求和 ? Double sum = orders.stream().filter(item -> item.getAllAmt() != null).mapToDouble(Order::getAllAmt).sum(); ? ? // 最大總金額 ? OptionalDouble max = orders.stream().filter(item -> item.getAllAmt() != null).mapToDouble(Order::getAllAmt).max(); ? // 防止沒有訂單數(shù)據(jù)的處理 ? Double maxAllAmt = max.isPresent() ? max.getAsDouble() : 0; ?? ? // 最小總金額 ? OptionalDouble min = orders.stream().filter(item -> item.getAllAmt() != null).mapToDouble(Order::getAllAmt).min(); ? ? // 平均總金額 ? OptionalDouble average = orders.stream().filter(item -> item.getAllAmt() != null).mapToDouble(Order::getAllAmt).average();
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis如何使用注解實現(xiàn)一對多關(guān)聯(lián)查詢
這篇文章主要介紹了mybatis如何使用注解實現(xiàn)一對多關(guān)聯(lián)查詢的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
IntelliJ?IDEA社區(qū)版2021.3配置SpringBoot項目詳細(xì)教程及失敗案例
IntelliJ?IDEA?2021.3.3是一款集成開發(fā)環(huán)境,用于Java和其他編程語言的開發(fā),下面這篇文章主要給大家介紹了關(guān)于IntelliJ?IDEA社區(qū)版2021.3配置SpringBoot項目詳細(xì)教程及失敗案例的相關(guān)資料,需要的朋友可以參考下2024-03-03
SpringBoot+MyBatis-Plus實現(xiàn)數(shù)據(jù)庫讀寫分離的代碼示例
在當(dāng)今互聯(lián)網(wǎng)應(yīng)用中,數(shù)據(jù)庫讀寫分離是提高系統(tǒng)性能和穩(wěn)定性的重要手段之一,通過將讀操作和寫操作分別路由到不同的數(shù)據(jù)庫節(jié)點,可以有效減輕數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān),本文將介紹如何利用SpringBoot和MyBatis-Plus框架實現(xiàn)數(shù)據(jù)庫讀寫分離,需要的朋友可以參考下2023-11-11
從SpringBoot打war包并配置外部Tomcat運行的全流程
由于其他原因,我們需要使用SpringBoot打成war包放在外部的Tomcat中運行,本文就以一個案例來說明從SpringBoot打war包到Tomcat配置并運行的全流程經(jīng)過,需要的朋友可以參考下2024-06-06
詳解Mybatis攔截器安全加解密MySQL數(shù)據(jù)實戰(zhàn)
本文主要介紹了Mybatis攔截器安全加解密MySQL數(shù)據(jù)實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01

