Java8新特性整理之构建流的方式
流的创建方式
由值创建流
你可以使用静态方法Stream.of
,通过显式值创建一个流。它可以接受任意数量的参数。
Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");
stream.map(String::toUpperCase).forEach(System.out::println);
使用empty
方法得到一个空流:
Stream<String> emptyStream = Stream.empty();
由数组创建流
可以使用静态方法Arrays.stream从数组创建一个流。它接受一个数组作为参数。
int[] numbers = {2, 3, 5, 7, 11, 13};
int sum = Arrays.stream(numbers).sum();
由集合创建流
直接使用上节的例子,menu是集合的引用:
int calories = menu.stream()
.map(Dish::getCalories)
.reduce(0, Integer::sum);
由文件生成流
java.nio.file.Files
中的很多静态方法都会返回一个流。
@Test
public void testFileStream() {
URI uri = null;
try {
uri = this.getClass().getClassLoader()
.getResource("logstash/sms-state-info.log").toURI();
try (Stream<String> lines = Files.lines(Paths.get(uri), Charset.defaultCharset())) {
lines.map(String::toString)
.forEach(log -> {
System.out.println("长度 log:" + log.length());
});
}
} catch (URISyntaxException | IOException e) {
e.printStackTrace();
}
}
Files.lines
方法,它会返回一个由指定文件中的各行构成的字符串流。
由函数生成流:创建无限流
Stream API提供了两个静态方法来从函数生成流:Stream.iterate
和Stream.generate
。
这两个操作可以创建所谓的无限流:不像从固定集合创建的流那样有固定大小的流。由iterate
和generate
产生的流会用给定的函数按需创建值,因此可以无穷无尽地计算下去!一般来说,
应该使用limit(n)
来对这种流加以限制,以避免打印无穷多个值。
Stream.iterate(0, n -> n + 2)
.limit(10)
.forEach(System.out::println);
流的第一个元素是初始值0。然后加
上2来生成新的值2,再加上2来得到新的值4,以此类推。这种iterate操作基本上是顺序的,
因为结果取决于前一次应用。
请注意,此操作将生成一个无限流——这个流没有结尾,因为值是按需计算的,可以永远计算下去。我们说这个流是无界的。