java8从list集合中取出某一属性的值的集合案例
作者:*饼饼* 发布时间:2023-04-30 01:51:49
我就废话不多说了,大家还是直接看代码吧~
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("",30,"男");
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)
结语:本人目前用到这么多,希望各位有更好的或者其它的用法给予建议与评论,有错误也希望能得到指正!也希望大家多多支持脚本之家。
来源:https://blog.csdn.net/Hedy17/article/details/88838801


猜你喜欢
- 问题描述1.可以访问同一个文件夹下面的success.jsp文件,如图:2、却不能访问同一个文件夹下面的 index.html文件,如图:问
- C# 4.0提供了一个dynamic 关键字,那么什么是dynamic,究竟dynamic是如何工作的呢?从最简单的示例开始:static
- 前言在前面的文章中其实大家也已经看到我使用过collect(Collectors.toList()) 将数据最后汇总成一个 List 集合。
- Map集合Map集合存储的是键值对Map集合的实现类:HashTable、LinkedHashMap、HashMap、TreeMapHash
- 使用Collections.sort对中文进行排序使用collections.sort(List list, Comparator <
- 一、堆参数设置-XX:+PrintGC 使用这个参数,虚拟机启动后,只要遇到GC就会打印日志-XX:+UseSerialGC 配置串行回收器
- 前述园子里有许多人对log4net这款开源的日志记录控件有很多介绍。在这里个人再做一次总结,希望对以后有所帮助,需要的时候可以直接使用,减少
- 查 看: File------>Project Structure-------
- 我们就可以结合今天的Annotation Processing Tool(APT)来自定义注解处理器。注解处理器简单解释就是收集我们标记的注
- 先看看目前这4种数据库的分页写法:-- OracleSELECT * FROM ( SELECT RO
- PermissionManage项目地址:https://github.com/why168/AndroidProjects/tree/ma
- 字符串采用unicode编码的方式时,计算字符串长度的方法找出UNICODE编码中的汉字的代表的范围“\u4E00” 到“\u9FBB”之间
- 在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的File
- 循环对数组进行拷贝利用循环对数组进行拷贝很简单,就是利用循环将要拷贝的数组的元素逐个赋值给新的数组。具体代码实现如下:public stat
- maven的三种packaging方式pom是maven依赖文件jar是java普通项目打包war是java web项目打包pom:打出来可
- Autowired有两种注入方式by typeby name默认使用的是byType的方式向Bean里面注入相应的Bean。例如:@Auto
- 一.话题引入在做项目过程中,我们一般都是最先编写登录注册功能,登录功能最重要的是登录成功后,系统还会保存该登录用户信息,这种保存用户信息的逻
- 本文实例讲述了Android开发之SD卡文件操作。分享给大家供大家参考,具体如下:前面的文章中写过直接操作手机自带存储器的程序,这次就接着上
- 崩溃来源使用过AIDL进行跨进程通信的同学,肯定遇到过DeadObjectException这个崩溃,那么这个崩溃是怎么来的,我们又该如何解
- 为什么需要组件化小项目是不需要组件化的。当一个项目有数十个人开发,编译项目要花费10分钟,修改一个bug就可能会影响到其他业务,小小的改动就