Java 8中的Stream基本介绍

Stream基本概念

  • Stream流是来自数据源的元素队列并支持聚合操作:
    • 元素: 是特定类型的对象,是数据源形成的一个队列.Java中的Stream不会存储元素,而是按需计算
    • 数据源: Stream流数据的来源.可以是集合,数组,I/O Channel,产生器Generator等
    • 聚合操作: 类似SQL语句的一系列操作,比如filter,map,reduce,match和sorted等
  • Stream操作的两个基础特征:
    • Pipelining: 中间操作都会返回流本身.多个操作可以串成一个管道.这样就可以对操作进行优化,比如延迟执行laziness和短路short-circuiting
    • 内部迭代: 通常对集合的遍历都是通过Iterator或者forEach操作,显式地在集合外部进行迭代 .Stream提供了内部迭代的方式,通过访问者模式Visitor实现
  • 示例: 将流程转化为Java代码
+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+
List<Integer> transactionsIds = widgets.stream()
	.filter(b -> b.getColor == RED)
	.sorted((x, y) -> x.getWeight() - y.getWeight())
	.mapToInt(Widget :: getWeight)
	.sum();

生成流

  • 集合接口有两种方法来生成流:
    • stream(): 为集合创建串行流
    • parallelStream(): 为集合创建并行流
List<String> strings = Arrays.asList("I", "want", "to", "be", "", "great");
List<String> filter = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

forEach

  • Stream中使用forEach来迭代流中的每个数据
Random random = new Random();
random.ints().limit(10).forEach(System.out :: println);

map

  • map方法用于映射每个元素到对应的结果
/*
 * 使用map输出元素对应的平方数
 */
 List<Integer> numbers = Arrays.asList(2, 3, 5, 6, 6, 8);
 List<Integer> squareNums = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList()); 

filter

  • filter方法用于通过设置的条件过滤出元素
List<String> strings = Arrays.asList("I", "want", "to", "be", "", "great");
long count = Strings.stream().filter(string -> string.isEmpty()).count();

limit

  • limit方法用于获取指定数量的流
Random random = new Random();
random.ints().limit(10).forEach(System.out :: println);

sorted

  • sorted方法用于对流进行排序
Random random = new Random();
random.ints().limit(10).forEach(System.out :: println);

parallelStream

  • parallelStream是流并行处理程序的代替方法
List<String> strings = Arrays.asList("I", "want", "to", "be", "", "great");
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
  • 可以很容易的在顺序运行和并行之间进行直接切换

Collectors

  • Collectors类实现很多归约操作,比如将流转换成集合和聚合元素
  • Collectors可用于返回列表和字符串
List<String> strings = Arrays.asList("I", "want", "to", "be", "", "great");
// 过滤掉空字符串
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
// 合并字符串
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(","));

统计

  • 产生统计结果的收集器,主要用于int,double,long等类型
List<Integer> numbers = Arrays.asList(3, 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());

猜你喜欢

转载自blog.csdn.net/JewaveOxford/article/details/107540913