List stream流
- 使用Java8 stream流對List進行遍歷、過濾、查詢、去重、排序等,Java8提供了Stream(流)處理集合的關(guān)鍵抽象概念,它可以對集合進行的操作,可以執(zhí)行非常復(fù)雜的查找、過濾和映射數(shù)據(jù)等操作。Stream API 借助于同樣新出現(xiàn)的Lambda表達式,極大的提高編程效率和程序可讀性
實例一
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","張三");
map.put("age","20");
map.put("sex","男");
Map<String,Object> map2 = new HashMap<String,Object>();
map2.put("name","張四");
map2.put("age","20");
map2.put("sex","男");
Map<String,Object> map3 = new HashMap<String,Object>();
map3.put("name","張五");
map3.put("age","20");
map3.put("sex","男");
List<Map<String,Object>> list = new ArrayList<Map<String,Object>();
list.add(map);
list.add(map2);l
ist.add(map3);
List<Object> nameList = list.stream().map(item -> item.get("name")).collect(Collectors.toList());
System.out.println(nameList);
//運行結(jié)果
//[張三, 張四, 張五]
//刪除一個,便于看出差別來
nameList.remove(0);
List<Object> name =list.stream().filter(item -> nameList.contains(item.get("name"))).map(item -> item.get("name")).collect(Collectors.toList());
System.out.println(name);
//運行結(jié)果
//[張四, 張五]
- .stream().collect()
- 把list1中的所有Bean對象轉(zhuǎn)成map,其中,id是map的key,Bean對象本身是map的value
Map<Object,Object> changeMap = list.stream().collect(Collectors.toMap(item -> item.get("name"),e->e));
System.out.println(changeMap);
//運行結(jié)果
//{張四={sex=男, name=張四, age=20}, 張三={sex=男, name=張三, age=20}, 張五={sex=男, name=張五, age=20}}
- .stream().filter().collect()
- 按條件過濾后生成map,與上方的filter類似,只保留ids中有的id的bean對象
Map<Object,Object> changeMap2 = list.stream().filter(item -> nameList.contains(item.get("name"))).collect(Collectors.toMap(item -> item.get("name"),e -> e));
System.out.println(changeMap2);
//運行結(jié)果
//{張四={sex=男, name=張四, age=20}, 張五={sex=男, name=張五, age=20}}
實例二
package com.test.entity;
import lombok.Data;
@Data
public class Student {
/**
* id 主鍵
*/
private Integer Id;
/**
* 姓名
*/
private String name;
/**
* 年齡
*/
private Integer age;
/**
* 年級
*/
private String grade;
/**
* 班級
*/
private String classNmae;
public Student(Integer id, String name, Integer age, String grade, String classNmae) {
Id = id;
this.name = name;
this.age = age;
this.grade = grade;
this.classNmae = classNmae;
}
}
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(3,"小明",16,"高一","3班"));
studentList.add(new Student(6,"小李",18,"高三","1班"));
studentList.add(new Student(9,"小王",16,"高一","2班"));
studentList.add(new Student(3,"小徐",17,"高二","4班"));
studentList.add(new Student(5,"小馬",19,"高三","6班"));
studentList.forEach(System.out::println);
//運行結(jié)果
/**
Student(Id=3, name=小明, age=16, grade=高一, classNmae=3班)
Student(Id=6, name=小李, age=18, grade=高三, classNmae=1班)
Student(Id=9, name=小王, age=16, grade=高一, classNmae=2班)
Student(Id=3, name=小徐, age=17, grade=高二, classNmae=4班)
Student(Id=5, name=小馬, age=19, grade=高三, classNmae=6班) **/
- findAny() 和 findFirst()
- findFirst() 和 findAny() 都是獲取列表中的第一條數(shù)據(jù),但是findAny()操作,返回的元素是不確定的,對于同一個列表多次調(diào)用findAny()有可能會返回不同的值。使用findAny()是為了更高效的性能。如果是數(shù)據(jù)較少,串行地情況下,一般會返回第一個結(jié)果,如果是并行(parallelStream并行流)的情況,那就不能確保是第一個。
System.out.println("====================獲取姓名為'小徐'的學(xué)生信息,如果沒有找到則返回null====================");
Student selectOne = studentList.stream().filter(stu -> stu.getName().equals("小徐")).findAny().orElse(null);
Student selectTwo= studentList.stream().filter(stu -> stu.getName().equals("小徐")).findAny().get();
System.out.println(selectOne);
System.out.println(selectTwo);
//運行結(jié)果
//Student(Id=3, name=小徐, age=17, grade=高二, classNmae=4班)
//Student(Id=3, name=小徐, age=17, grade=高二, classNmae=4班)
- 使用 distinct() 方法可以去除重復(fù)的數(shù)據(jù)。
- 獲取年紀列表,去除重復(fù)的數(shù)據(jù)
System.out.println("====================對list去重====================");
List<String> gradeList = studentList.stream().map(stu -> stu.getGrade()).distinct().collect(Collectors.toList());
gradeList.forEach(System.out::println);
//運行結(jié)果
//高一
//高三
//高二
System.out.println("====================對list排序====================");
System.out.println("====================升序(默認)====================");
List<Student> ascList = studentList.stream().sorted(Comparator.comparing(Student::getId)).collect(Collectors.toList());
ascList.forEach(System.out::println);
System.out.println("====================降序====================");
List<Student> descList = studentList.stream().sorted(Comparator.comparing(Student::getId).reversed()).collect(Collectors.toList());
descList.forEach(System.out::println);
System.out.println("====================多條件降序排序====================");
List<Student> descConList = studentList.stream().sorted(Comparator.comparing(Student::getId).reversed().thenComparing(Comparator.comparing(Student::getAge)).reversed()).collect(Collectors.toList());
descConList.forEach(System.out::println);
//運行結(jié)果
====================對list排序====================
====================升序(默認)====================
Student(Id=3, name=小明, age=16, grade=高一, classNmae=3班)
Student(Id=3, name=小徐, age=17, grade=高二, classNmae=4班)
Student(Id=5, name=小馬, age=19, grade=高三, classNmae=6班)
Student(Id=6, name=小李, age=18, grade=高三, classNmae=1班)
Student(Id=9, name=小王, age=16, grade=高一, classNmae=2班)
====================降序====================
Student(Id=9, name=小王, age=16, grade=高一, classNmae=2班)
Student(Id=6, name=小李, age=18, grade=高三, classNmae=1班)
Student(Id=5, name=小馬, age=19, grade=高三, classNmae=6班)
Student(Id=3, name=小明, age=16, grade=高一, classNmae=3班)
Student(Id=3, name=小徐, age=17, grade=高二, classNmae=4班)
====================多條件降序排序====================
Student(Id=3, name=小徐, age=17, grade=高二, classNmae=4班)
Student(Id=3, name=小明, age=16, grade=高一, classNmae=3班)
Student(Id=5, name=小馬, age=19, grade=高三, classNmae=6班)
Student(Id=6, name=小李, age=18, grade=高三, classNmae=1班)
Student(Id=9, name=小王, age=16, grade=高一, classNmae=2班)
- groupingBy對list分組
- 根據(jù)年級分組
System.out.println("====================對List分組====================");
Map<String,List<Student>> groupStu = studentList.stream().collect(Collectors.groupingBy(Student::getGrade));
groupStu.forEach((key,value) ->{
System.out.println("KEY:"+key);
value.forEach(System.out::println);
System.out.println("*************************");
});
System.out.println(groupStu);
//運行結(jié)果
====================對List分組====================
KEY:高三
Student(Id=6, name=小李, age=18, grade=高三, classNmae=1班)
Student(Id=5, name=小馬, age=19, grade=高三, classNmae=6班)
*************************
KEY:高二
Student(Id=3, name=小徐, age=17, grade=高二, classNmae=4班)
*************************
KEY:高一
Student(Id=3, name=小明, age=16, grade=高一, classNmae=3班)
Student(Id=9, name=小王, age=16, grade=高一, classNmae=2班)
*************************
{高三=[Student(Id=6, name=小李, age=18, grade=高三, classNmae=1班), Student(Id=5, name=小馬, age=19, grade=高三, classNmae=6班)], 高二=[Student(Id=3, name=小徐, age=17, grade=高二, classNmae=4班)], 高一=[Student(Id=3, name=小明, age=16, grade=高一, classNmae=3班), Student(Id=9, name=小王, age=16, grade=高一, classNmae=2班)]}
整理自
https://blog.csdn.net/BHSZZY/article/details/122860048
https://blog.csdn.net/qq_42021376/article/details/109141670
|