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中的Stream并不会储存元素,而是按需计算。
- 数据源:可以是集合、数据、I/O channel或者产生器generator等等
- 聚合操作:类似于sql语句一样的操作,例如filter、sorted、mapToInt和foreach等等
生成流
Java 8 中,集合接口有两种生成流的方法
- stream() - 为集合创建串行流
- parallelStream() - 为集合创建并行流
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());
感谢各位伙计给娃子点的关机(关注)

网友评论