创建流

所有 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());