java8從list集合中取出某一屬性的值的集合案例
我就廢話不多說了,大家還是直接看程式碼吧~
List<Order> list = new ArrayList<User>(); Order o1 = new Order("1","MCS-2019-1123"); list.add(o1 ); Order o2= new Order("2","MCS-2019-1124"); list.add(o2); Order o3= new Order("3","MCS-2019-1125"); list.add(o3); List<String> orderNoList=list.stream().map(Order::getOrderNo).collect(Collectors.toList()); System.out.println("輸出單號集合:"+orderNoList); List<String> idList=list.stream().map(Order::getId()).collect(Collectors.toList()); System.out.println(idList)
結果
輸出第一個:
["MCS-2019-1123","MCS-2019-1124","MCS-2019-1125"]
[1,2,3]
order類:
public class Order{ String id; String orderNo; public Order(String id,String orderNo) { this.id = id; this.orderNo= orderNo; } public String getId() { return id; } public void setId(String order) { this.id= id; } public String getOrderNo() { return orderNo; } public void setOrderNo(String message) { this.orderNo= orderNo; } }
補充知識:java8快速對list集合的篩選計算取值總結
在我們日常開發過程中,有很多場景需要對list集合進行取值篩選,以下是我對常用的一些知識點進行總結
首先,建立一個需要用到的物件,例如學生物件,有相關欄位:姓名,年齡,性別
public class Student { private String name; private int age; private String sex; public Student( String name,int age,String sex) { this.age = age; this.name = name; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
其次,對這些欄位屬性進行賦值
Student s1 = new Student("小金",20,"女"); Student s2 = new Student("小宋",21,"女"); Student s3 = new Student("小張",25,"男"); Student s4 = new Student("小王",27,"男"); Student s5 = new Student("小王",30,"未知"); List<Student> list = new ArrayList<>(); list.add(s1); list.add(s2); list.add(s3); list.add(s4); list.add(s5);
1、遍歷-foreach
使用stream流進行foreach遍歷
list.stream().forEach(student->{ //處理邏輯,打印出所有學生的姓名 System.out.println(student.getName()); });
執行結果:
2、篩選list
filter函式的()裡,應該放邏輯,判斷條件,將符合條件的放到resultList中
程式碼如下,篩選集合中所有性別為女的學生
List<Student> resultList = list.stream().filter(student -> Objects.equals(student.getSex(),"女")).collect(Collectors.toList()); resultList.stream().forEach(student->{ System.out.println(student.getName()); });
執行結果:
3、list去重
根據性別去重
List<Student> unique = list.stream().collect(Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getSex))),ArrayList::new)); unique.stream().forEach(student->{ System.out.println(student.getName()); });
執行結果:
4、取出list集合物件中某一個屬性
取出每個物件中的姓名組成一個新的集合
List<String> listStr = list.stream().map(Student::getName).collect(Collectors.toList());
去重
List<String> listNew = listStr .stream().map(Student::getName).distinct().collect(Collectors.toList());
執行結果:
5、list與map互轉,並根據某一屬性進行分組
list轉map (下方studentMap執行會報錯,因為作為key值,name不能重複,所以正式開發中應該使用唯一性id作為key值)
Map<String,Student> studentMap = list.stream().collect(Collectors.toMap(Student::getName,student -> student));
list轉陣列
String[] listStrs = list.stream() .filter(e -> Objects.equals(e.getSex(),"男")) .sorted(Comparator.comparing(Student::getName)) .map(Student::getName).toArray(String[]::new);
list轉map並且分組
Map<String,List<Student>> listMap = list.stream().collect(Collectors.groupingBy(Student::getSex));
執行結果:
根據物件某些屬性,進行分組
Map<List,List> studentsMap= list.stream()
.collect(Collectors.groupingBy(f -> Arrays.asList(f.getAge),f.getSex())));
map轉list
List<Student> collect = studentMap.values().stream().collect(Collectors.toList());
6、過濾屬性為空的欄位
Student s6 = new Student("","男"); list.add(s6); List<String> stringList = list.stream().map(s -> s.getName()).filter(s -> !s.isEmpty()).collect(Collectors.toList());
7、根據某一屬性進行計算
根據年齡求最大值、最小值、平均值、總和、個數
IntSummaryStatistics resultNum = list.stream().mapToInt((item)->item.getAge()).summaryStatistics(); System.out.println("max:"+resultNum.getMax()); System.out.println("min:"+resultNum.getMin()); System.out.println("sum:"+resultNum.getSum()); System.out.println("average:"+resultNum.getAverage()); System.out.println("count:"+resultNum.getCount());
執行結果:
注意:
1、求和有三種類型,mapToInt,mapToLong,mapToDouble
2、如果是Bigdecimal數值型別,則計算方法如下,(新建物件)
Frult frult1 = new Frult("西瓜",new BigDecimal(1)); Frult frult2 = new Frult("梨子",new BigDecimal(2)); List<Frult> frultList = new ArrayList<>(); frultList.add(frult1); frultList.add(frult2); BigDecimal totalPrice = frultList.stream().map(Frult::getPrice).reduce(BigDecimal.ZERO,BigDecimal::add); //或者用mapToInt()進行強轉(int->Bigdecimal)
結語:本人目前用到這麼多,希望各位有更好的或者其它的用法給予建議與評論,有錯誤也希望能得到指正!也希望大家多多支援我們。