java8从list集合中取出某一属性的值的集合案例
我就废话不多说了,大家还是直接看代码吧~
Listlist=newArrayList (); Ordero1=newOrder("1","MCS-2019-1123"); list.add(o1); Ordero2=newOrder("2","MCS-2019-1124"); list.add(o2); Ordero3=newOrder("3","MCS-2019-1125"); list.add(o3); List orderNoList=list.stream().map(Order::getOrderNo).collect(Collectors.toList()); System.out.println("输出单号集合:"+orderNoList); List 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类:
publicclassOrder{ Stringid; StringorderNo; publicOrder(Stringid,StringorderNo){ this.id=id; this.orderNo=orderNo; } publicStringgetId(){ returnid; } publicvoidsetId(Stringorder){ this.id=id; } publicStringgetOrderNo(){ returnorderNo; } publicvoidsetOrderNo(Stringmessage){ this.orderNo=orderNo; } }
补充知识:java8快速对list集合的筛选计算取值总结
在我们日常开发过程中,有很多场景需要对list集合进行取值筛选,以下是我对常用的一些知识点进行总结
首先,创建一个需要用到的对象,例如学生对象,有相关字段:姓名,年龄,性别
publicclassStudent{ privateStringname; privateintage; privateStringsex; publicStudent(Stringname,intage,Stringsex){ this.age=age; this.name=name; this.sex=sex; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } publicStringgetSex(){ returnsex; } publicvoidsetSex(Stringsex){ this.sex=sex; } }
其次,对这些字段属性进行赋值
Students1=newStudent("小金",20,"女"); Students2=newStudent("小宋",21,"女"); Students3=newStudent("小张",25,"男"); Students4=newStudent("小王",27,"男"); Students5=newStudent("小王",30,"未知"); Listlist=newArrayList<>(); 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中
代码如下,筛选集合中所有性别为女的学生
ListresultList=list.stream().filter(student->Objects.equals(student.getSex(),"女")).collect(Collectors.toList()); resultList.stream().forEach(student->{ System.out.println(student.getName()); });
运行结果:
3、list去重
根据性别去重
Listunique=list.stream().collect(Collectors.collectingAndThen( Collectors.toCollection(()->newTreeSet<>(Comparator.comparing(Student::getSex))),ArrayList::new)); unique.stream().forEach(student->{ System.out.println(student.getName()); });
运行结果:
4、取出list集合对象中某一个属性
取出每个对象中的姓名组成一个新的集合
List
listStr=list.stream().map(Student::getName).collect(Collectors.toList());
去重
List
listNew=listStr.stream().map(Student::getName).distinct().collect(Collectors.toList());
运行结果:
5、list与map互转,并根据某一属性进行分组
list转map(下方studentMap运行会报错,因为作为key值,name不能重复,所以正式开发中应该使用唯一性id作为key值)
Map
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
>listMap=list.stream().collect(Collectors.groupingBy(Student::getSex));
运行结果:
根据对象某些属性,进行分组
Map
studentsMap=list.stream()
.collect(Collectors.groupingBy(f->Arrays.asList(f.getAge),f.getSex())));
map转list
List
collect=studentMap.values().stream().collect(Collectors.toList());
6、过滤属性为空的字段
Students6=newStudent("",30,"男"); list.add(s6); ListstringList=list.stream().map(s->s.getName()).filter(s->!s.isEmpty()).collect(Collectors.toList());
7、根据某一属性进行计算
根据年龄求最大值、最小值、平均值、总和、个数
IntSummaryStatisticsresultNum=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数值类型,则计算方法如下,(新建对象)
Frultfrult1=newFrult("西瓜",newBigDecimal(1)); Frultfrult2=newFrult("梨子",newBigDecimal(2)); ListfrultList=newArrayList<>(); frultList.add(frult1); frultList.add(frult2); BigDecimaltotalPrice=frultList.stream().map(Frult::getPrice).reduce(BigDecimal.ZERO,BigDecimal::add); //或者用mapToInt()进行强转(int->Bigdecimal)
结语:本人目前用到这么多,希望各位有更好的或者其它的用法给予建议与评论,有错误也希望能得到指正!也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。