获取 Stream 对象的方式
在 Java 中获取 Stream
对象的方式多种多样,涵盖了集合、数组、文件、生成器等场景。以下是 12 种常见获取 Stream
的方式及详细说明:
1. 从集合获取 Stream
所有实现 Collection
接口的类(如 List
、Set
、Queue
)均可直接通过 stream()
或 parallelStream()
方法获取流。
List<String> list = Arrays.asList("A", "B", "C");// 获取顺序流
Stream<String> stream = list.stream();// 获取并行流
Stream<String> parallelStream = list.parallelStream();
2. 从数组获取 Stream
通过 Arrays.stream()
或 Stream.of()
将数组转换为流。
String[] array = {"Java", "Python", "C++"};// 方式1:Arrays.stream()
Stream<String> stream1 = Arrays.stream(array);// 方式2:Stream.of()
Stream<String> stream2 = Stream.of(array);// 基本类型数组(避免装箱开销)
int[] intArray = {1, 2, 3};
IntStream intStream = Arrays.stream(intArray);
3. 从文件获取 Stream
使用 Files.lines()
逐行读取文件内容生成流。
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;try (Stream<String> lines = Files.lines(Paths.get("data.txt"))) {lines.forEach(System.out::println);
} catch (IOException e) {e.printStackTrace();
}
4. 从 I/O 资源获取 Stream
如 BufferedReader
的 lines()
方法生成流。
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.stream.Stream;try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {Stream<String> lines = reader.lines();lines.forEach(System.out::println);
} catch (IOException e) {e.printStackTrace();
}
5. 生成无限流
通过 Stream.iterate()
或 Stream.generate()
生成无限序列。
// 生成斐波那契数列的前10项
Stream.iterate(new int[]{0, 1}, fib -> new int[]{fib[1], fib[0] + fib[1]}).limit(10).map(fib -> fib[0]).forEach(System.out::println);// 生成随机数流
Stream<Double> randoms = Stream.generate(Math::random).limit(5);
6. 通过 Stream.Builder
构建流
动态添加元素生成流。
Stream.Builder<String> builder = Stream.builder();
builder.add("Apple").add("Banana").add("Cherry");
Stream<String> stream = builder.build();
7. 从字符串分割获取 Stream
使用 Pattern.splitAsStream()
分割字符串生成流。
import java.util.regex.Pattern;
import java.util.stream.Stream;Stream<String> words = Pattern.compile(", ").splitAsStream("Java, Python, C++");
words.forEach(System.out::println); // 输出: Java Python C++
8. 合并多个流
通过 Stream.concat()
合并两个流。
Stream<String> stream1 = Stream.of("A", "B");
Stream<String> stream2 = Stream.of("C", "D");
Stream<String> merged = Stream.concat(stream1, stream2); // A, B, C, D
9. 基本类型流
通过 IntStream
、LongStream
、DoubleStream
处理基本数据类型。
// 生成范围流
IntStream range = IntStream.range(1, 5); // 1, 2, 3, 4// 从集合转换
List<Integer> numbers = Arrays.asList(1, 2, 3);
IntStream intStream = numbers.stream().mapToInt(Integer::intValue);
10. 空流
通过 Stream.empty()
创建空流。
Stream<String> emptyStream = Stream.empty();
11. 单元素流
通过 Stream.of()
创建包含单个元素的流。
Stream<String> singleElementStream = Stream.of("Hello");
12. 其他第三方库
如 Guava 或 Apache Commons 提供的工具类:
// Guava 示例:从 Iterable 创建流
Iterable<String> iterable = Lists.newArrayList("A", "B");
Stream<String> guavaStream = StreamSupport.stream(iterable.spliterator(), false);
总结:Stream 获取方式速查表
场景 | 方法/类 | 示例 |
---|---|---|
集合 | Collection.stream() | list.stream() |
数组 | Arrays.stream() 或 Stream.of() | Arrays.stream(array) |
文件 | Files.lines() | Files.lines(Paths.get("data.txt")) |
I/O 资源 | BufferedReader.lines() | reader.lines() |
无限序列 | Stream.iterate() / generate() | Stream.iterate(0, n -> n + 1) |
动态构建流 | Stream.Builder | Stream.builder().add("A").build() |
字符串分割 | Pattern.splitAsStream() | Pattern.compile(",").splitAsStream(s) |
合并流 | Stream.concat() | Stream.concat(s1, s2) |
基本类型流 | IntStream / LongStream 等 | IntStream.range(1, 5) |
空流 | Stream.empty() | Stream.empty() |
单元素流 | Stream.of() | Stream.of("Hello") |
第三方库支持 | Guava / Apache Commons | StreamSupport.stream(iterable) |