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