建立流

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