创建流
所有 java Collection<E>s 都有 stream() 和 parallelStream() 方法,可以从中构造 Stream<E>:
Collection<String> stringList = new ArrayList<>();
Stream<String> stringStream = stringList.parallelStream();
可以使用以下两种方法之一从数组创建 Stream<E>:
String[] values = { "aaa", "bbbb", "ddd", "cccc" };
Stream<String> stringStream = Arrays.stream(values);
Stream<String> stringStreamAlternative = Stream.of(values);
Arrays.stream() 和 Stream.of() 之间的区别在于 Stream.of() 有一个 varargs 参数,所以它可以像:
Stream<Integer> integerStream = Stream.of(1, 2, 3);
你还可以使用原始的 Streams。例如:
IntStream intStream = IntStream.of(1, 2, 3);
DoubleStream doubleStream = DoubleStream.of(1.0, 2.0, 3.0);
这些原始流也可以使用 Arrays.stream() 方法构建:
IntStream intStream = Arrays.stream(new int[]{ 1, 2, 3 });
可以从具有指定范围的数组创建 Stream。
int[] values= new int[]{1, 2, 3, 4, 5};
IntStream intStram = Arrays.stream(values, 1, 3);
请注意,可以使用 boxed 方法将任何基本流转换为盒装类型流:
Stream<Integer> integerStream = intStream.boxed();
如果你想收集数据,这在某些情况下很有用,因为原始流没有任何以 Collector 为参数的 collect 方法。
重用流链的中间操作
当调用终端操作时,流被关闭。当仅终端操作仅变化时,重用中间操作流。我们可以创建一个流供应商来构建一个新流,其中已经设置了所有中间操作。
Supplier<Stream<String>> streamSupplier = () -> Stream.of("apple", "banana","orange", "grapes", "melon","blueberry","blackberry")
.map(String::toUpperCase).sorted();
streamSupplier.get().filter(s -> s.startsWith("A")).forEach(System.out::println);
// APPLE
streamSupplier.get().filter(s -> s.startsWith("B")).forEach(System.out::println);
// BANANA
// BLACKBERRY
// BLUEBERRY
int[] 数组可以使用流转换为 List<Integer>
int[] ints = {1,2,3};
List<Integer> list = IntStream.of(ints).boxed().collect(Collectors.toList());