建立流
所有 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);
你還可以使用原始的 Stream
s。例如:
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());