6 流
- Collection 提供了心的 stream() 方法
- 流不存储值,通过管道的方式获取值
- 本质是函数式的,对流的操作会生成一个结果,不过并不会修改底层的数据源,集合可以作为流的底层数据源
- 延迟查找,很多炉操作(过滤、映射、排序等)都可以延迟实现。
6.1 流由3部分构成:
- 源
- 零个或者多个中间操作(惰性求值)
- 终止操作(及早求值)
6.2 流操作的分类:
- 惰性求值
- 及早求值
steam.xx().yy().zz().count(); 其中xx().yy().zz()都是惰性操作,没有调用count方法之前,都不会做。count() 就是及早求值。
6.3 stream 流的创建常用方式
- 根据 Stream 静态方法 of 实现。
- 根据 数组 实现
- 根据 集合 实现
package cn.zxhysy.jdk8.steam;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class SteamTest1 {
public static void main(String[] args) {
Stream stream1 = Stream.of("hello", "world", "hello world");
String[] myArray = new String[]{"hello", "world", "hello world"};
Stream stream2 = Stream.of(myArray);
Stream stream3 = Arrays.stream(myArray);
List<String> list = Arrays.asList(myArray);
Stream stream4 = list.stream();
}
}
6.4 流带来的简化操作
在这里,我们来介绍下 IntStream 整数流。
package cn.zxhysy.jdk8.steam;
import java.util.stream.IntStream;
public class StreamTest2 {
public static void main(String[] args) {
IntStream.of(new int[]{1, 2, 3, 4}).forEach(System.out::println);
// java8之前写法
// for (int i : new int[]{1, 2, 3, 4}) {
// System.out.println(i);
// }
// range(3,8) 不包含8
IntStream.range(3, 8).forEach(System.out::println);
// java8之前写法
// for (int i = 3; i < 8; i++) {
// System.out.println(i);
// }
// rangeClosed(3, 8) 包含8
IntStream.rangeClosed(3,8).forEach(System.out::println);
}
}
再来看一个:
package cn.zxhysy.jdk8.steam;
import java.util.Arrays;
import java.util.List;
public class StreamTest3 {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4);
System.out.println(list.stream().map(i -> 2*i).reduce(0,Integer::sum));
// java8 之前的写法
// Integer acc = 0;
// for (Integer i : list) {
// Integer integer = 2 * i;
// acc = acc + integer;
// }
// System.out.println(acc);
}
}
可以看出,在对数据操作上,java8 方便了许多,这是一条必经之路,好好学习。