java8引入了stream流的特性,在对集合数据的处理上能够带来很大的便利性。虽然我一开始看到别人使用stream流的代码时我也是一脸懵逼不懂什么意思,于是我花了点时间学习了下,并简单记录下java8中流的使用以及自己的一些代码测试样例。
java8中流提供了很多方法,常用的方法有如下几个:
- stream() 为集合创建串行流(比较常用)
- parallelStream() 为集合创建并行流
- forEach() 迭代数据
- map() 用于映射每个元素到对应的结果
- filter() 用于通过设置的条件过滤出元素
- limit() 用于获取指定数量的流
- sorted() 用于对流进行排序
- collect() 用于跟Collectors类配合实现将流转换成集合或聚合元素
直接看方法肯定是一脸懵逼,所以可以复制下方代码到编辑器中自己实际操作一下能更好的理解并学会使用。
public class Test {
public static void main(String[] args) {
List res;
//获取数据
List<User> list = getList();
System.out.println("场景1:打印每个用户的信息");
//场景一单独抽出成方法,方便后续查看结果调用
printList(list);
System.out.println("场景2:根据年龄排序(升序)");
res = list.stream()
.sorted(Comparator.comparing(User::getAge))
.collect(Collectors.toList());
printList(res);
System.out.println("场景3:根据年龄排序(降序)");
res = list.stream()
.sorted(Comparator.comparing(User::getAge).reversed())
.collect(Collectors.toList());
printList(res);
System.out.println("场景4:取年龄最小的前3个用户");
res = list.stream()
.sorted(Comparator.comparing(User::getAge))
.limit(3)
.collect(Collectors.toList());
printList(res);
System.out.println("场景5:选出已经成年(年龄>=18)的用户");
res = list.stream()
.filter(e -> e.getAge() >= 18)
.collect(Collectors.toList());
printList(res);
System.out.println("场景6:提取所有人的姓名");
res = list.stream()
.map(User::getName)
.collect(Collectors.toList());
printList(res);
System.out.println("场景7:计算所有人的年龄之和");
Integer reduce = list.stream()
.map(User::getAge)
.reduce(0, (a, b) -> a + b);
System.out.println("年龄之和:" + reduce);
System.out.println("==============\n");
}
private static List<User> getList() {
return Arrays.asList(
new User("小赵",20),
new User("小钱",9),
new User("小孙",18),
new User("小李",13)
);
}
private static void printList(List list){
list.forEach(System.out::println);
System.out.println("==============\n");
}
}
@Data
@ToString
@AllArgsConstructor
class User{
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
}
代码说明:
User类是一个用户类,为了方便使用了Lombok注解
getList()方法用于创造一个用户list数据
printList()方法使用forEach对集合进行遍历打印,方便查看结果
上述代码执行结果:
场景1:打印每个用户的信息
User(name=小赵, age=20)
User(name=小钱, age=9)
User(name=小孙, age=18)
User(name=小李, age=13)
==============
场景2:根据年龄排序(升序)
User(name=小钱, age=9)
User(name=小李, age=13)
User(name=小孙, age=18)
User(name=小赵, age=20)
==============
场景3:根据年龄排序(降序)
User(name=小赵, age=20)
User(name=小孙, age=18)
User(name=小李, age=13)
User(name=小钱, age=9)
==============
场景4:取年龄最小的前3个用户
User(name=小钱, age=9)
User(name=小李, age=13)
User(name=小孙, age=18)
==============
场景5:选出已经成年(年龄>=18)的用户
User(name=小赵, age=20)
User(name=小孙, age=18)
==============
场景6:提取所有人的姓名
小赵
小钱
小孙
小李
==============
场景7:计算所有人的年龄之和
年龄之和:60
==============
总结:Java8的流操作,真香!