// 如何从值序列、数组、文件来创建流,甚至由生成函数来创建无限流!
// 由值创建流 Stream.of 创建了一个字符串流。然后,你可以将字符串转换为大写,再一个个打印出来
Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");
// stream.map(String::toUpperCase).forEach(System.out::println);
// 空流 Stream<String> emptyStream = Stream.empty();
// 由数组创建流
int[] numbers = { 2, 3, 5, 7, 11, 13 };
// System.out.println(Arrays.stream(numbers).sum());
// 由文件生成流
long uniqueWords = 0;
// String path =
// NumericStreams.class.getClass().getResource("/lambdasinaction/chap5/data.txt").getPath();
String path2 = (Thread.currentThread().getContextClassLoader().getResource("")
+ "lambdasinaction/chap5/data.txt").substring(6).replace("/", "\\");
System.out.println(path2);
try (Stream<String> lines = Files.lines(Paths.get(path2), Charset.defaultCharset())) {
uniqueWords = lines.flatMap(line -> {
System.out.println("-------" + line);
return Arrays.stream(line.split(" "));
}).distinct().count();
} catch (IOException e) {
} finally {
System.out.println(uniqueWords);
}
// 生成函数来创建无限流
// Stream.iterate 和 Stream.generate 这两个操作可以创建所谓的无限流
// 迭代
// Stream.iterate(0, n -> n + 2).limit(5).forEach(System.out::println);
// print 斐波纳契元组序列
Stream.iterate(new int[] { 0, 1 }, t -> new int[] { t[1], t[0] + t[1] }).limit(5)
.forEach(t -> System.out.println("(" + t[0] + "," + t[1] + ")"));
Stream.iterate(new int[] { 0, 1 }, t -> new int[] { t[1], t[0] + t[1] }).map(t -> t[0]).limit(5)
.forEach(System.out::println);
// 生成 generate 不是依次对每个新生成的值应用函数的。它接受一个 Supplier<T> 类型的Lambda提供新的值
Stream.generate(Math::random).limit(5).forEach(System.out::println);
//有状态的修改,并行是危险的
IntSupplier fib = new IntSupplier() {
private int previous = 0;
private int current = 1;
public int getAsInt() {
int oldPrevious = this.previous;
int nextValue = this.previous + this.current;
this.previous = this.current;
this.current = nextValue;
return oldPrevious;
}
};
IntStream.generate(fib).limit(5).forEach(System.out::println);
4种构建流的方式实例
最新推荐文章于 2022-07-18 11:12:06 发布