Java8 中常用的List Stream场景
Stream是Java 8添加的一个API,结合Lambda
表达式,可以提高我们对对集合处理的编码效率。在日常工作中,我们经常会遇到List
转Map的情况,在Stream
出来之前,我们一般都是遍历放进map中。
这里,我们假设有个User
对象
1 | @Getter |
List转Map
Map中
key
和value
都是User
对象中的属性值1
Map<String, String> userMap = users.stream().collect(Collectors.toMap(User::getId, User::getName));
Map中
key
为User
对象的属性值,value
为User
对象1
Map<String, User> userMap = users.stream().collect(Collectors.toMap(User::getId, User -> User));
如果,我们的List中,
key
值重复,则会出现Duplicate key
异常,这时候,我们可以使用覆盖的方式来避免这种异常1
Map<String, User> userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity(), (oldVal, newVal) -> newVal));
Map中
key
为User
对象的属性值,value
为User
List
1 | Map<String, List<User>> userMap = users.stream().collect(Collectors.groupingBy(User::getId)); |
filter
list stream过滤数据
1
List<User> filterUsers=users.stream().filter(item -> item.getName().equals("xxx")).collect(Collectors.toList());
去重过滤
1
2
3
4
5
6
7
8
9
10
List<String> ids=new ArrayList<>();
List<User> distinctUsers=users.stream().filter(item->{
if(!ids.contains(item.getId())){
ids.add(item.getId());
return true;
}else{
return false;
}
}).collect(Collectors.toList());stream有提供
distinct
去重的函数。
sorted
1 .按年龄升序排
1 | List<User> sortUsers= users.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList()); |
2.按年龄降序排
1 | List<User> sortUsers= users.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList()); |
除了上面的一些函数外,还有功能强大的函数,如:limit
、max
、reduce
等。
Java Stream Debugger
在我们使用Stream
之后,调试是一个问题。
在IDEA 2018
后,会自带Java Stream Debugger
这个插件,有助于我们更直观的了解Stream
的执行过程。插件有了,我们该如何使用呢?
- 在需要调试
Stream
的地方,打上断点。
2.debug模式启动后,在debug窗口中点击Trace Current Stream Chain
我们可以点击切换上面每一步的tab,查看其执行的一个大致过程,我们也可以切换到Flat Mode
模式
这里只是列举了几个常用的API,针对Stream的能力远比上面列举几个简单的功能要强大。
Java8 中常用的List Stream场景