目录标题
由值创建流(Stream.of
、 Stream.empty()
)
# 由值创建流
Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");
stream.map(String::toUpperCase).forEach(System.out::println);
# 空流
Stream<String> emptyStream = Stream.empty();
由数组创建流(Arrays.stream
)
# 普通数字
int[] numbers = {2, 3, 5, 7, 11, 13};
int sum = Arrays.stream(numbers).sum();
由集合创建流(list.stream()
)
list.stream()
由字符串创建流(IntStream.range(0, str.length()).mapToObj(str::charAt)
)
# 字符数组
String SENTENCE = " Nel mezzo mi ritrovai in una selva oscura che la dritta via era smarrita ";
Stream<Character> stream = IntStream.range(0, SENTENCE.length()).mapToObj(SENTENCE::charAt);
Stream<Character> stream = IntStream.iterate(SENTENCE.length() - 1, i -> i - 1).limit(SENTENCE.length()).mapToObj(SENTENCE::charAt);
由文件创建流(Files.lines
)
long uniqueWords = 0;
try (Stream<String> lines = Files.lines(Paths.get("data.txt"), Charset.defaultCharset())) { ←─流会自动关闭
uniqueWords = lines.flatMap(line -> Arrays.stream(line.split(" "))).distinct().count();
} catch (IOException e) {
// 如果打开文件时出现异常则加以处理
}
生成流(Stream.iterate
、Stream.generate
)
# 正偶数的流
Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(10);
stream.forEach(System.out::println);
# 斐波纳契元组序列
Stream<int[]> stream = Stream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0] + t[1]}).limit(20);
stream.forEach(t -> System.out.println("(" + t[0] + "," + t[1] + ")"));
# 生成一个流有五个0到1之间的随机双精度数
Stream<Double> stream = Stream.generate(Math::random).limit(5);
stream.forEach(System.out::println);
# 生成一个全是1的无限流
IntStream ones = IntStream.generate(() -> 1);
-----------------------------------------------------------------------------读书笔记摘自 书名:Java 8实战 作者:[英] Raoul-Gabriel Urma [意] Mario Fusco [英] Alan M 读书笔记 第 5 章 使用流 5.7 构建流
[Q&A] Stream.iterate、Stream.generate 区别
iterate生成的元素是基于前一个元素的,有明确的依赖关系;而generate生成的元素彼此独立,没有依赖前一个元素的概念。