Java使用Lambda表達式查找list集合中是否包含某值問題
更新時間:2023年06月01日 15:45:25 作者:張蛋腚
Java使用Lambda表達式查找list集合中是否包含某值的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
使用Lambda表達式查找list集合中是否包含某值
for (String className : allClassName) { if (!classDetailList.stream().filter(o -> ToolUtil.equals(o.getClassName(), className)).findFirst().isPresent()) { classDetailList.add(new AftersaleStatisticDTO().setClassName(className)); } }
lambda表達式對List的常見操作記錄
List轉Map
@Data class Person { private String uuid; private String name; private String gender; private int age; public Person(String name, String gender, int age) { this.uuid = UUID.randomUUID().toString(); this.name = name; this.gender = gender; this.age = age; } }
List<Person> persons = new ArrayList<>(); persons.add(new Person("張三", "男", 27)); persons.add(new Person("李四", "男", 14)); persons.add(new Person("王五", "女", 17)); persons.add(new Person("趙六", "女", 34));
分組
Map<Boolean, List<Person>> personsByAge = persons.stream() ?? ?.collect(Collectors.partitioningBy(p -> p.getAge() > 18)); System.out.println(JSON.toJSONString(personsByAge));
Map<String, List<Person>> personByGender = persons.stream() ?? ?.collect(Collectors.groupingBy(Person::getGender)); System.out.println(JSON.toJSONString(personByGender));
自定義Map
Map<String, String> uuidNameMap = persons.stream() ?? ?.collect(Collectors.toMap(Person::getUuid, Person::getName)); System.out.println(JSON.toJSONString(uuidNameMap));
實際情況有可能同一個key會對應多個value,就有可能拋Duplicate key異常。這時可以傳入第三個參數(shù)決定重復時如何選擇,比如我們想構造<name, uuid>的映射,但是考慮可能有重名的可能,就可以這么做:
Map<String, String> nameUuidMap = persons.stream() ?? ?.collect(Collectors.toMap(Person::getName, Person::getUuid, (p1, p2) -> p1)); System.out.println(JSON.toJSONString(nameUuidMap));
這里(p1, p2) -> p1表示如果重復則取前者。
常用循環(huán)
常規(guī)循環(huán)
public class CollectionEach { ? ? public static void main(String[] args) { ? ? ? ? // 創(chuàng)建一個集合 ? ? ? ? Collection objs = new HashSet(); ? ? ? ? objs.add("C語言中文網(wǎng)Java教程"); ? ? ? ? objs.add("C語言中文網(wǎng)C語言教程"); ? ? ? ? objs.add("C語言中文網(wǎng)C++教程"); ? ? ? ? // 調用forEach()方法遍歷集合 ? ? ? ? objs.forEach(obj -> System.out.println("迭代集合元素:" + obj)); ? ? } }
單屬性提取集合
List<BuyProduction> productions List<Long> list = productions.stream().map(BuyProduction::getProductionId).collect(Collectors.toList());
排序
求最大值或最小值
class Stu{ ? ? private String str; ? ? public Stu(String str) { ? ? ? ? this.str = str; ? ? } ? ? public void setStr(String str) { ? ? ? ? this.str = str; ? ? } ? ? public String getStr() { ? ? ? ? return str; ? ? } } public static void main(String[] args) { ? ? List<Stu> dateList = new ArrayList<>(); ? ? dateList.add(new Stu("2022-02-15")); ? ? dateList.add(new Stu("2021-12-25")); ? ? dateList.add(new Stu("2024-02-15")); ? ? dateList.add(new Stu("2023-02-15")); ? ? Stu minStu = dateList.stream().min(Comparator.comparing(Stu::getStr)).get(); ? ? Stu maxStu = dateList.stream().max(Comparator.comparing(Stu::getStr)).get(); ? ? System.out.println("maxStu = " + maxStu.getStr()); ? ? System.out.println("minStu = " + minStu.getStr()); }
import java.util.*; public class Demo{ ? ?public static void main(String[] args){ ? ? ? ArrayList<Integer> my_arr = new ArrayList<Integer>(); ? ? ? my_arr.add(190); ? ? ? my_arr.add(267); ? ? ? my_arr.add(12); ? ? ? my_arr.add(0); ? ? ? System.out.println("排序之前,數(shù)組列表中的元素是 : " + my_arr); ? ? ? Collections.sort(my_arr, (o1, o2) -> (o1 > o2) ? -1 : (o1 < o2) ? 1 : 0); ? ? ? System.out.println("排序后,數(shù)組列表中的元素是 : " + my_arr); ? ?} }
樹形結構排序
import java.util.*; public class Demo{ ? ?public static void main(String[] args){ ? ? ? TreeMap<Integer, String> my_treemap = new TreeMap<Integer, String>((o1, o2) -> (o1 > o2) ? -1 : ? ? ? (o1 < o2) ? 1 : 0); ? ? ? my_treemap.put(56, "Joe"); ? ? ? my_treemap.put(43, "Bill"); ? ? ? my_treemap.put(21, "Charolette"); ? ? ? my_treemap.put(33, "Jonas"); ? ? ? System.out.println("treemap包含以下元素: " + my_treemap); ? ?} }
其他排序
public class Demo01 { ? ? public static void main(String[] args) { ? ? ? ? // 定義字符串數(shù)組 ? ? ? ? String[] strArr = { "abc", "cd", "abce", "a" }; ? ? ? ? // 傳統(tǒng)方法 ? ? ? ? // 匿名內部類 ? ? ? ? Arrays.sort(strArr, new Comparator<String>() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public int compare(String s1, String s2) { ? ? ? ? ? ? ? ? return Integer.compare(s2.length(), s1.length()); ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? // 輸出排序結果 ? ? ? ? for (String s : strArr) { ? ? ? ? ? ? System.out.println(s); ? ? ? ? } ? ? ? ? System.out.println("---------------------"); ? ? ? ? // Lambda表達式 ? ? ? ? Arrays.sort(strArr, (s1, s2) -> Integer.compare(s2.length(), s1.length())); ? ? ? ? // 輸出 ? ? ? ? for (String s : strArr) { ? ? ? ? ? ? System.out.println(s); ? ? ? ? }
遍歷
常規(guī)遍歷
for (Hero h : heros) { ? ?if (h.hp > 100 && h.damage < 50) ? ? ? System.out.println(h.name); }
聚合遍歷
heros ? ? .stream() ? ? .filter(h -> h.hp > 100 && h.damage < 50) ? ? .forEach(h -> System.out.println(h.name));
對元素進行篩選:
- filter 匹配
- distinct 去除重復(根據(jù)equals判斷)
- sorted 自然排序
- sorted(Comparator) 指定排序
- limit 保留
- skip 忽略
轉換為其他形式的流:
- mapToDouble 轉換為double的流
- map 轉換為任意類型的流
public class Hero implements Comparable<Hero>{ ? ? public String name; ? ? public float hp; ? ? public int damage; ? ? public Hero(){ ? ? } ? ? public String getName() { ? ? ? ? return name; ? ? } ? ? public void setName(String name) { ? ? ? ? this.name = name; ? ? } ? ? public float getHp() { ? ? ? ? return hp; ? ? } ? ? public void setHp(float hp) { ? ? ? ? this.hp = hp; ? ? } ? ? public int getDamage() { ? ? ? ? return damage; ? ? } ? ? public void setDamage(int damage) { ? ? ? ? this.damage = damage; ? ? } ? ? public Hero(String name) { ? ? ? ? this.name =name; ? ? } ? ? //初始化name,hp,damage的構造方法 ? ? public Hero(String name,float hp, int damage) { ? ? ? ? this.name =name; ? ? ? ? this.hp = hp; ? ? ? ? this.damage = damage; ? ? } ? ? @Override ? ? public int compareTo(Hero anotherHero) { ? ? ? ? if(damage<anotherHero.damage) ? ? ? ? ? ? return 1;? ? ? ? ? else ? ? ? ? ? ? return -1; ? ? } ? ? @Override ? ? public String toString() { ? ? ? ? return "Hero [name=" + name + ", hp=" + hp + ", damage=" + damage + "]rn"; ? ? } } package lambda; import java.util.ArrayList; import java.util.List; import java.util.Random; import charactor.Hero; public class TestAggregate { ? ? public static void main(String[] args) { ? ? ? ? Random r = new Random(); ? ? ? ? List<Hero> heros = new ArrayList<Hero>(); ? ? ? ? for (int i = 0; i < 5; i++) { ? ? ? ? ? ? heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100))); ? ? ? ? } ? ? ? ? //制造一個重復數(shù)據(jù) ? ? ? ? heros.add(heros.get(0)); ? ? ? ? System.out.println("初始化集合后的數(shù)據(jù) (最后一個數(shù)據(jù)重復):"); ? ? ? ? System.out.println(heros); ? ? ? ? System.out.println("滿足條件hp>100&&damage<50的數(shù)據(jù)"); ? ? ? ? heros ? ? ? ? ? ? .stream() ? ? ? ? ? ? .filter(h->h.hp>100&&h.damage<50) ? ? ? ? ? ? .forEach(h->System.out.print(h)); ? ? ? ? System.out.println("去除重復的數(shù)據(jù),去除標準是看equals"); ? ? ? ? heros ? ? ? ? ? ? .stream() ? ? ? ? ? ? .distinct() ? ? ? ? ? ? .forEach(h->System.out.print(h)); ? ? ? ? System.out.println("按照血量排序"); ? ? ? ? heros ? ? ? ? ? ? .stream() ? ? ? ? ? ? .sorted((h1,h2)->h1.hp>=h2.hp?1:-1) ? ? ? ? ? ? .forEach(h->System.out.print(h)); ? ? ? ? System.out.println("保留3個"); ? ? ? ? heros ? ? ? ? ? ? .stream() ? ? ? ? ? ? .limit(3) ? ? ? ? ? ? .forEach(h->System.out.print(h)); ? ? ? ? System.out.println("忽略前3個"); ? ? ? ? heros ? ? ? ? ? ? .stream() ? ? ? ? ? ? .skip(3) ? ? ? ? ? ? .forEach(h->System.out.print(h)); ? ? ? ? System.out.println("轉換為double的Stream"); ? ? ? ? heros ? ? ? ? ? ? .stream() ? ? ? ? ? ? .mapToDouble(Hero::getHp) ? ? ? ? ? ? .forEach(h->System.out.println(h)); ? ? ? ? System.out.println("轉換任意類型的Stream"); ? ? ? ? heros ? ? ? ? ? ? .stream() ? ? ? ? ? ? .map((h)-> h.name + " - " + h.hp + " - " + h.damage) ? ? ? ? ? ? .forEach(h->System.out.println(h)); ? ? } }
結束操作
forEach()
遍歷每個元素toArray()
轉換為數(shù)組min(Comparator)
取最小的元素max(Comparator)
取最大的元素count()
總數(shù)findFirst()
第一個元素
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import org.omg.Messaging.SYNC_WITH_TRANSPORT; import charactor.Hero; public class TestAggregate { ? ? public static void main(String[] args) { ? ? ? ? Random r = new Random(); ? ? ? ? List<Hero> heros = new ArrayList<Hero>(); ? ? ? ? for (int i = 0; i < 5; i++) { ? ? ? ? ? ? heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100))); ? ? ? ? } ? ? ? ? System.out.println("遍歷集合中的每個數(shù)據(jù)"); ? ? ? ? heros ? ? ? ? ? ? .stream() ? ? ? ? ? ? .forEach(h->System.out.print(h)); ? ? ? ? System.out.println("返回一個數(shù)組"); ? ? ? ? Object[] hs= heros ? ? ? ? ? ? .stream() ? ? ? ? ? ? .toArray(); ? ? ? ? System.out.println(Arrays.toString(hs)); ? ? ? ? System.out.println("返回傷害最低的那個英雄"); ? ? ? ? Hero minDamageHero = ? ? ? ? heros ? ? ? ? ? ? .stream() ? ? ? ? ? ? .min((h1,h2)->h1.damage-h2.damage) ? ? ? ? ? ? .get(); ? ? ? ? System.out.print(minDamageHero); ? ? ? ? System.out.println("返回傷害最高的那個英雄"); ? ? ? ? Hero mxnDamageHero = ? ? ? ? ? ? ? ? heros ? ? ? ? ? ? ? ? .stream() ? ? ? ? ? ? ? ? .max((h1,h2)->h1.damage-h2.damage) ? ? ? ? ? ? ? ? .get(); ? ? ? ? System.out.print(mxnDamageHero); ? ?? ? ? ? ? System.out.println("流中數(shù)據(jù)的總數(shù)"); ? ? ? ? long count = heros ? ? ? ? ? ? ? ? .stream() ? ? ? ? ? ? ? ? .count(); ? ? ? ? System.out.println(count); ? ? ? ? System.out.println("第一個英雄"); ? ? ? ? Hero firstHero = ? ? ? ? ? ? ? ? heros ? ? ? ? ? ? ? ? .stream() ? ? ? ? ? ? ? ? .findFirst() ? ? ? ? ? ? ? ? .get(); ? ? ? ? System.out.println(firstHero); ? ? } }
去重
//按學生姓名去重 //可能會改變原有l(wèi)ist的順序 List<Student> list = studentList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getName))), ArrayList::new)); //直接去重 List<String> l = new ArryList(); List<String> list = l.stream().distinct().collect(Collectors.toList());
過濾
//按學生姓名過濾 List<Student> list = studentList.stream().filter(item -> "張三".equals(item.getName())).collect(Collectors.toList());
抽取
//按學生姓名抽取形成新對象Person List<Person> personList = studentList.stream().map(s->{ ?? ??? ??? ??? ??? ?Person person = new Person(); ?? ??? ??? ??? ??? ?person .setName(s.getName()); ?? ??? ??? ??? ??? ?return person ; ?? ??? ??? ??? ?}).collect(Collectors.toList()); //按學生id抽取形成map集合 Map<Long, Person> personMap = studentList.stream().collect(Collectors.toMap(s -> s.getId(), s -> s)); //按學生id抽取形成map集合,取第一個 Map<Long, Person> personMap = studentList.stream().collect(Collectors.toMap(s -> s.getId(), s -> s,(first,last)->first)); //按學生id抽取形成set集合 Set<Long> idSet = studentList.stream().map(s-> s.getId()).collect(Collectors.toSet());
計數(shù)
Map<String, Long> map = students.stream().collect(Collectors.groupingBy(Student::getName, Collectors.counting()));
最值
//最小 Integer min = studentList.stream().map(Student::getAge).min(Student::compareTo).get(); //最大 Integer max = studentList.stream().map(Student::getAge).max(Student::compareTo).get(); // 最大對象 User max = userList.stream().max(Comparator.comparing(Student::getAge)).get(); // 最小對象 User min = userList.stream().min(Comparator.comparing(Student::getAge)).get();
匹配
//查找list中是否都是張三 boolean result = studentList.stream().allMatch((s) -> s.getName().equals("張三")); //查找list中是否有一個是張三 boolean result = studentList.stream().anyMatch((s) -> s.getName().equals("張三")); //判斷l(xiāng)ist中沒有張三 boolean result = studentList.stream().noneMatch((s) -> s.getName().equals("張三"));
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java畢業(yè)設計實戰(zhàn)之在線網(wǎng)盤系統(tǒng)的實現(xiàn)
這是一個使用了java+JSP+Springboot+maven+mysql+ThymeLeaf+FTP開發(fā)的在線網(wǎng)盤系統(tǒng),是一個畢業(yè)設計的實戰(zhàn)練習,具有網(wǎng)盤該有的所有功能,感興趣的朋友快來看看吧2022-01-01Java?詳解Collection集合之ArrayList和HashSet
本章具體介紹了ArrayList和HashSet兩種集合的基本使用方法和區(qū)別,圖解穿插代碼實現(xiàn)。?JAVA成仙路從基礎開始講,后續(xù)會講到JAVA高級,中間會穿插面試題和項目實戰(zhàn),希望能給大家?guī)韼椭?/div> 2022-03-03最新評論