1. 程式人生 > >Java8新特性整理之構建流的方式

Java8新特性整理之構建流的方式

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.iterateStream.generate

這兩個操作可以建立所謂的無限流:不像從固定集合建立的流那樣有固定大小的流。由iterate
generate產生的流會用給定的函式按需建立值,因此可以無窮無盡地計算下去!一般來說,
應該使用limit(n)來對這種流加以限制,以避免列印無窮多個值。

Stream.iterate(0, n -> n + 2) 
      .limit(10) 
      .forEach(System.out::println); 

流的第一個元素是初始值0。然後加
上2來生成新的值2,再加上2來得到新的值4,以此類推。這種iterate操作基本上是順序的,
因為結果取決於前一次應用。

請注意,此操作將生成一個無限流——這個流沒有結尾,因為值是按需計算的,可以永遠計算下去。我們說這個流是無界的。