Java8新特性之Stream

2022-04-07  本文已影响0人  山巅自相见

Java 8 API新的抽象称为流Stream,可以让开发者以一种声明的方式处理数据,这也太讷了。
Stream运用一种类似SQL从数据库查询数据这种直观的方式来提供一种对Java集合运算和表达的高阶抽象。

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

以上代码转换为Java代码为

List<Integer> transactionsIds = 
widgets.stream()
             .filter(b -> b.getColor() == RED)
             .sorted((x,y) -> x.getWeight() - y.getWeight())
             .mapToInt(Widget::getWeight)
             .sum();

什么是Stream

Stream(流)是一个来自于数据源的元素队列并支持聚合操作

生成流

Java 8 中,集合接口有两种生成流的方法

List<String> list = Arrays.asList("abc", "", "bs", "abc", "");
List<String> strList = list.stream().filter(str -> !str.isEmpty()).collect(Collectors.toList());

foreach

Stream提供了新的‘foreach’来迭代流中的每个数据

Ramdom random = new Ramdom();
// 随机生成10个随机数
random.stream().limit(10).foreach(System.out::println);

map

map方法用于映射每一个元素到对应的结果

List<Integer> list = Arrays.asList(3, 2, 2, 4, 5, 3);
// 获取每个元素的平方
List<Integer> squaresList = list.stream().map(i -> i * i).distinct.collect(Collectors.toList);

filter

filter方法用于通过设置条件过滤出元素

List<String> list = Arrays.asList("abc", "", "bs", "abc", "");
// 获取空字符串的数量
list.stream().filter(str -> str.isEmpty()).count();

sorted

sorted方法用于对流进行排序

Ramdom random = new Ramdom();
random.stream().limit(10).sorted().foreach(System.out::println);

Collectors

Collectors实现了许多归约操作,例如将流转换成集合和聚合元素。Collectors可用于返回字符串或集合。

List<String> list = Arrays.asList("abc", "", "bs", "abc", "");
List<String> strList = list.stream().filter(str -> !str.isEmpty()).collect(Collectors.toList());
System.out.println("筛选列表:" + strList);
List<String> strList = list.stream().filter(str -> !str.isEmpty()).collect(Collectors.joining("|"));
System.out.println("合并字符串:" + strList);

统计

一些产生结果的收集器也非常有用,主要用于int、double、long等基本类型上。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());

感谢各位伙计给娃子点的关机(关注)


不点赞的长这样🐵
上一篇 下一篇

猜你喜欢

热点阅读