JDK 1.8 使用Stream实现List操作小结

简介: 实际项目中经常需要对得到的集合元素进行操作.Stream 是 jdk1.8 中处理集合的流概念,它可以指定你希望对集合进行的操作,通过内部迭代实现非常复杂的查找、过滤和映射数据等操作

1,首先,有一个普通的DTO对象

public class Employee {


/*** 姓名*/privateStringname;
/*** 性别*/privateStringgender;
/*** 薪资*/privateDoublesalary;
publicEmployee(Stringname, Stringgender, doublesalary) {
super();
this.name=name;
this.gender=gender;
this.salary=salary;
}
@OverridepublicStringtoString() {
return"Employee [name="+name+", gender="+gender+", salary="+salary+"]";
}
publicEmployee() {
super();
}
publicStringgetName() {
returnname;
}
publicvoidsetName(Stringname) {
this.name=name;
}
publicDoublegetSalary() {
returnsalary;
}
publicvoidsetSalary(Doublesalary) {
this.salary=salary;
}
publicStringgetGender() {
returngender;
}
publicvoidsetGender(Stringgender) {
this.gender=gender;
}


}


2,对集合实现各种操作和运算结果

public class MainClass {


publicstaticvoidmain(Stringarg[]) {
List<Employee>list=newArrayList<Employee>();
list.add(newEmployee("宋江","男",1500));
list.add(newEmployee("武松","男",1200));
list.add(newEmployee("林冲","男",1000));
list.add(newEmployee("扈三娘","女",800));
list.add(newEmployee("顾大嫂","女",500));
// 筛选符合某条件的元素 -> 求性别为男的员工集合List<Employee>l1=list.stream().filter(e->e.getGender().equals("男")).collect(Collectors.toList());
// 结果 -> [Employee [name=宋江, gender=男, salary=1500.0], Employee [name=武松, gender=男, salary=1200.0], Employee [name=林冲, gender=男, salary=1000.0]]// 获取集合中的某一元素的集合 ->获取所有员工的姓名集合List<String>l2=list.stream().map(Employee::getName).collect(Collectors.toList());
// 结果 -> [宋江, 武松, 林冲, 扈三娘, 顾大嫂]// 分组函数groupingBy 按性别进行分组统计人数Map<String, Integer>map=list.stream().collect(Collectors.groupingBy(Employee::getGender, Collectors.summingInt(p->1)));
// 结果 -> {女=2, 男=3}// 集合中某元素的求和 -> 求性别为男的员工总岁数Doublesum=list.stream().filter(e->e.getGender().equals("男")).mapToDouble(Employee::getSalary).sum();
// 结果 -> 3700.0//归约是将集合中的所有元素经过指定运算,折叠成一个元素输出,如:求最值、平均数等,这些操作都是将一个集合的元素折叠成一个元素输出//求薪资最高的员工Employeeem=list.stream().reduce((e1, e2) ->e1.getSalary() >e2.getSalary() ?e1:e2).get();
// 或者直接用Collectors.maxBy 方法Employeee2=list.stream().collect(Collectors.maxBy(Comparator.comparing(Employee::getSalary))).get();
// 结果 -> Employee [name=宋江, gender=男, salary=1500.0]// 匹配元素// anyMatch 是否匹配任一元素,查看元素中是否有工资小于600的booleancheck1=list.stream().anyMatch(e->e.getSalary() <600); // 结果 -> true// allMatch 是否匹配所有元素 查看是否所有员工的工资都小于600booleancheck2=list.stream().allMatch(e->e.getSalary() <600); // 结果 -> false// noneMatch 是否未匹配所有元素 查看是否所有员工工资都大于400 booleancheck3=list.stream().noneMatch(e->e.getSalary() <400);// 结果 -> true// 求元素的平均值 -> 员工的平均工资// 求所有人的平均工资doubleavg=list.stream().collect(Collectors.averagingDouble(Employee::getSalary));
// 结果 -> 1000.0//按薪资从小到大排序List<Employee>l3=list.stream().sorted((s1, s2) ->s1.getSalary().compareTo(s2.getSalary())).collect(Collectors.toList());
// 结果 -> [Employee [name=顾大嫂, gender=女, salary=500.0], Employee [name=扈三娘, gender=女, salary=800.0], Employee [name=林冲, gender=男, salary=1000.0], //        Employee [name=武松, gender=男, salary=1200.0], Employee [name=宋江, gender=男, salary=1500.0]]// 截取 -> 求薪资最少的两个员工,在上述 l3的结果上截取List<Employee>l4=l3.stream().limit(2).collect(Collectors.toList());
// 结果-> [Employee [name=顾大嫂, gender=女, salary=500.0], Employee [name=扈三娘, gender=女, salary=800.0]]// 获取所有的名字,组成一条语句 参数分别为(CharSequence delimiter,CharSequence prefix,CharSequence suffix)Stringstr=list.stream().map(Employee::getName).collect(Collectors.joining(",", "[", "]"));
// 结果->[宋江,武松,林冲,扈三娘,顾大嫂]//用于收集统计数据(如计数,最小值,最大值,总和和平均值)的状态对象// 获取工资的最大值、最小值、平均值、求和等等DoubleSummaryStatisticsdoubleSummaryStatistics=list.stream().mapToDouble(Employee::getSalary).summaryStatistics();
doubleaverage=doubleSummaryStatistics.getAverage(); // 结果 -> 1000.00doublemax=doubleSummaryStatistics.getMax();         // 结果 -> 1500.0doublemin=doubleSummaryStatistics.getMin();         // 结果 -> 500.00longcount=doubleSummaryStatistics.getCount();       // 结果 -> 5doublesum2=doubleSummaryStatistics.getSum();        // 结果 -> 5000.00// list转换成map 某两个元素作为键值对// 员工的姓名最为key, 薪资作为value 转化成mapMap<String, Double>map1=list.stream().collect(Collectors.toMap(Employee::getName, Employee::getSalary));
// 结果 -> {武松=1200.0, 林冲=1000.0, 扈三娘=800.0, 顾大嫂=500.0, 宋江=1500.0}// 返回对象本身Map<String, Employee>map2=list.stream().collect(Collectors.toMap(Employee::getName, employee->employee));
// 结果 -> {武松=Employee [name=武松, gender=男, salary=1200.0], 林冲=Employee [name=林冲, gender=男, salary=1000.0], 扈三娘=Employee [name=扈三娘, gender=女, salary=800.0],//        顾大嫂=Employee [name=顾大嫂, gender=女, salary=500.0], 宋江=Employee [name=宋江, gender=男, salary=1500.0]}//在list转为map时,作为key的值有可能重复,这时候流的处理会抛出个异常:Java.lang.IllegalStateException:Duplicate key。//这时候就要在toMap方法中指定当key冲突时key的选择。(这里是选择第二个key覆盖第一个key)Map<String, Employee>map3=list.stream().collect(Collectors.toMap(Employee::getName,Function.identity(),(k1,k2)->k2));
// 返回的value 是集合// 员工的性别为key,对象集合为valueMap<String, List<Employee>>map4=list.stream().collect(Collectors.groupingBy(Employee::getGender));
// 结果 -> {女=[Employee [name=扈三娘, gender=女, salary=800.0], Employee [name=顾大嫂, gender=女, salary=500.0]], //          男=[Employee [name=宋江, gender=男, salary=1500.0], Employee [name=武松, gender=男, salary=1200.0], Employee [name=林冲, gender=男, salary=1000.0]]}// 利用skip 和limit 实现分页需求  list.stream().skip(pageSize * (pageNum - 1)).limit(pageSize).collect(Collectors.toList());// 查询第一页的信息, pageSize =10 pageNum =1List<Employee>l5=list.stream().skip(0).limit(10).collect(Collectors.toList());
// 结果-> [Employee [name=宋江, gender=男, salary=1500.0], Employee [name=武松, gender=男, salary=1200.0], Employee [name=林冲, gender=男, salary=1000.0], //         Employee [name=扈三娘, gender=女, salary=800.0], Employee [name=顾大嫂, gender=女, salary=500.0]]}

}

相关文章
|
3月前
|
消息中间件 负载均衡 NoSQL
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
44 0
|
27天前
|
API
JDK8的stream有求和方法吗?
【8月更文挑战第20天】JDK8的stream有求和方法吗?
28 3
|
3月前
|
分布式计算 DataWorks 监控
DataWorks操作报错合集之遇到“OSERROR: argument list too long”的错误,该如何处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
44 1
|
3月前
|
Java API
使用 Java 来实现两个 List 的差集操作
使用 Java 来实现两个 List 的差集操作
45 3
|
3月前
|
Java
Java中list操作
Java中list操作
22 1
|
3月前
|
C++ 容器
9.STL中list的常见操作(图文并茂)
9.STL中list的常见操作(图文并茂)
|
3月前
|
Java
java操作list使用Stream
java操作list使用Stream
|
4月前
|
Java API
【JAVA进阶篇教学】第三篇:JDK8中Stream API使用
【JAVA进阶篇教学】第三篇:JDK8中Stream API使用
|
4月前
【stream】List根据某个字段求和
【stream】List根据某个字段求和
268 0
|
4月前
|
Java API
java 对象list 使用stream进行过滤
在Java中,你可以使用Stream API对对象列表进行过滤。假设你有一个`List<MyObject>`,并且你想根据某些条件过滤出特定的对象。以下是一个示例: ```java import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<MyObject> myObjects = ... // 初始化你的对象列表 List<MyObject> filter
308 1