java8如何根據(jù)list對(duì)象中的屬性過(guò)濾篩選
根據(jù)list對(duì)象中的屬性過(guò)濾篩選
代碼演示:
根據(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("錢(qián)"); student2.setSex("女"); Student student3 = new Student(); student3.setAge(20); student3.setName("孫"); student3.setSex("女"); Collections.addAll(students,student1,student2,student3); //根據(jù)條件過(guò)濾 出所有的女同學(xué) List<Student> result = students.stream().filter(student -> student.getSex().equals("女")).collect(Collectors.toList()); System.out.println(result);
執(zhí)行結(jié)果:
filter方法:
對(duì)流的過(guò)濾,將一個(gè)流轉(zhuǎn)換成另一個(gè)子集流
list根據(jù)對(duì)象某個(gè)字段或多個(gè)字段去重、篩選、List轉(zhuǎn)Map、排序、分組、統(tǒng)計(jì)計(jì)數(shù)等
我們利用 java8 的新特性,可以方便簡(jiǎn)潔高效的處理一些集合的數(shù)據(jù)。
簡(jiǎn)單示例如下
先定義一個(gè)訂單對(duì)象(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... }
過(guò)濾篩選
List<Order> orders = Lists.newArrayList(); ?? // 篩選總金額大于1000的訂單 orders = orders.stream().filter(item -> item.getAllAmt() > 1000.00f).collect(Collectors.toList());
分組
List<Order> orders = Lists.newArrayList(); ?? // 按照訂單類(lèi)型分組 Map<String, List<Order>> orderGroupMap = orders.stream().collect(Collectors.groupingBy(Order::getType));
去重
List<Order> orders = Lists.newArrayList(); ?? // 按照訂單編號(hào)去重 orders = orders.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ? ? ? ? ? -> new TreeSet<>(Comparator.comparing(Order::getNum))), ArrayList::new)); ? // 按照訂單編號(hào)和類(lèi)型去重 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)換成訂單編號(hào)-應(yīng)付金額 map,注意訂單編號(hào)作為 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 會(huì)導(dǎo)致排序失敗) ? orders.sort(Comparator.comparing(Order::getAllAmt).reversed()); ? ? // 先按照訂單類(lèi)型排序,再按照訂單應(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)計(jì)計(jì)數(shù)
List<Order> orders = Lists.newArrayList(); ?? ? // 統(tǒng)計(jì)所有訂單的總金額 ? // 求和 ? 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(); ? // 防止沒(méi)有訂單數(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();
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
RabbitMQ實(shí)現(xiàn)延時(shí)消息的兩種方法實(shí)戰(zhàn)教程
這篇文章主要介紹了RabbitMQ實(shí)現(xiàn)延時(shí)消息的兩種方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09springboot整合企微webhook機(jī)器人發(fā)送消息提醒
這篇文章主要為大家介紹了springboot整合企微webhook機(jī)器人發(fā)送消息提醒,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12java中functional interface的分類(lèi)和使用詳解
這篇文章主要介紹了java中functional interface的分類(lèi)和使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04SpringBoot利用Redis解決海量重復(fù)提交問(wèn)題
本文主要介紹了SpringBoot利用Redis解決海量重復(fù)提交問(wèn)題,介紹了三種常見(jiàn)的解決方案,包括使用Redis計(jì)數(shù)器,使用Redis分布式鎖和使用Redis發(fā)布/訂閱機(jī)制,感興趣的可以了解一下2024-03-03spring boot攔截器實(shí)現(xiàn)IP黑名單實(shí)例代碼
本篇文章主要介紹了spring boot攔截器實(shí)現(xiàn)IP黑名單實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04java實(shí)現(xiàn)http的Post、Get、代理訪問(wèn)請(qǐng)求
這篇文章主要為大家提供了java實(shí)現(xiàn)http的Post、Get、代理訪問(wèn)請(qǐng)求的相關(guān)代碼,感興趣的小伙伴們可以參考一下2016-01-01