java8 Stream

一、Stream原理

java8 Stream

1.使用Stream的基本步骤:

1)创建Stream
2)转换Stream,每次转换原有Stream对象不改变,返回一个新的Stream对象,【可以有多次转换】
3)对Stream进行聚合reduce操作,获取想要的结果;

2.创建Stream的方式:

1)通过Stream接口的静态工厂方法(注意:Java8里接口可以带静态方法);
a)of:有两个overload方法,一个接受变长参数,一个接口单一值。

Stream<Integer> integerStream = Stream.of(1, 2, 3, 5);

b)generator:生成一个无限长度的Stream,其元素的生成是通过给定的Supplier(这个接口可以看成一个对象的工厂,每次调用返回一个给定类型的对象),配合limit使用。

Stream.generate(Math::random).limit(10).forEach(System.out::println);

c)iterate:也是生成无限长度的Stream,和generator不同的是,其元素的生成是重复对给定的种子值(seed)调用用户指定函数来生成的。其中包含的元素可以认为是:seed,f(seed),f(f(seed))无限循环。

Stream.iterate(1, item -> item + 1).limit(10).forEach(System.out::println);

2)通过Collection接口的默认方法(默认方法:default method,也是Java8中的一个新特性,就是接口中的一个带有实现的方法)。

3.转换Stream:

List<Integer> nums = Lists.newArrayList(1,1,null,2,3,4,null,5,6,7,8,9,10);
System.out.println(“sum is:+ nums.stream()
							.filter(num -> num != null)
							.distinct()
							.mapToInt(num -> num * 2)
							.peek(System.out::println)
							.skip(2)
							.limit(4)
							.sum());

4.聚合(reduce):

reduce

二、两类操作

中间操作 终端操作
concat() allMatch() 判断条件里的元素,所有的都是,返回true
distinct() 去除重复元素 anyMatch() 判断的条件里,任意一个元素成功,返回true
filter() 过滤 collect() 收集器
flatMap() 合并两个Stream count() 计数
limit() 返回一个不超过给定长度的流。 findAny() findAny方法将返回当前流中的任意元素。
map() 对流中每一个元素应用函数 findFirst() 查找第一个元素
peek() 打断点 forEach() 遍历
skip() 返回一个扔掉了前n个元素的流。如果流中元素不足n个,则返回一个空流。 forEachOrdered() 顺序遍历
sorted() 排序 max() 最大
parallel() 并行 min() 最小
sequential() noneMatch() noneMatch跟allMatch相反,判断条件里的元素,所有的都不是,返回true
unordered() reduce() 聚合
toArray()

三、IntStream、LongStream和DoubleStream

相关文章: