【Java 8 新特性】Java Stream 通過skip()方法跳過前N個子元素

貓巳發表於2020-12-14

【Java 8 新特性】Java Stream 通過skip方法跳過前N個子元素


本頁將介紹 Stream.skip方法示例。 skip方法在跳過流的第一個給定元素之後返回一個由該流的其餘元素組成的流。

從javadoc中找到skip方法宣告。

Stream<T> skip(long n) 

引數:傳遞要跳過的前導元素數。
返回:該方法返回一個跳過元素的新流。
異常:如果我們傳遞負數,它將丟擲IllegalArgumentException。

  1. skip方法用於從一開始跳過給定數量元素的源流建立新流。
  2. skip方法對於有序並行管道,特別是對於n個數較多的情況,代價較高。
  3. skip方法是順序流管道的廉價操作。
  4. 如果要跳過的元素數n等於或大於流中的元素數,則輸出將為空流。
  5. skip是有狀態的中間操作(stateful intermediate operation)。

有狀態中間操作(stateful intermediate operation)
中間操作分為無狀態操作和有狀態操作。在處理諸如filter和map這樣的新元素時,無狀態操作不會保留以前看到的元素的狀態。當處理新元素(如skip和limit方法)時,有狀態操作可能包含以前看到的元素的狀態。

1.skip() 示例

找到一些skip() 方法的例子。

示例1
在這個例子中,我們有一個整數元素流,我們使用skip方法來獲得新的流,其中前三個元素將被丟棄.

Stream.of(10, 20, 30, 40, 50)
  .skip(3)
  .forEach(System.out::println); 

輸出將是40,50。

示例2
在這個例子中,我們有一個整數流。首先我們過濾它,提取偶數,然後在最後的結果中跳過前2個子元素.

Stream.of("C", "B", "D", "F", "E", "A")
  .sorted()// A,B,C,D,E,F
  .skip(2) //C,D,E,F
  .forEach(System.out::println); 

輸出為C,D,E,F。

示例3
這裡有亂序的字母表,先按排序,然後跳過前2個元素。

Stream.of("C", "B", "D", "F", "E", "A")
  .sorted()// A,B,C,D,E,F
  .skip(2) //C,D,E,F
  .forEach(System.out::println); 

輸出為C,D,E,F。

示例4
在這個例子中,我們將跳過比流中元素數更多的元素。輸出將為空流。

Stream.of("A", "B", "C", "D")
  .skip(5)
  .forEach(System.out::println); 

這將不列印任何內容,因為跳過後流中沒有元素。

2.skip() vs limit()

skip方法從開始處丟棄給定數量的元素並返回新的流,剩餘的元素數直到最後一個元素,而limit方法返回從第一個元素開始的給定數量的元素。

skiplimit都是中間操作並返回新的流。

示例1
這裡有一個整數列表。我們將在源流上執行limitskip兩者。看看結果。

SkipLimitDemo.java

package com.concretepage;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class SkipLimitDemo {
  public static void main(String[] args) {
	List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);

	List<Integer> afterLimit = list.stream().limit(4).collect(Collectors.toList());

	List<Integer> afterSkip = list.stream().skip(4).collect(Collectors.toList());

	System.out.println("Limit: " + afterLimit);
	System.out.println("Skip: " + afterSkip);
  }
} 

輸出

Limit: [1, 2, 3, 4]
Skip: [5, 6, 7, 8] 

示例2
在這個例子中,我們將首先對源元素執行skip,然後在skip方法返回的流上執行limit方法。

Stream.of(1,2,3,4,5,6,7,8)
	.skip(2) //3,4,5,6,7,8
        .limit(2) //3,4
	.forEach(System.out::println); 

輸出為3,4。

參考文獻

【1】Java doc: Stream
【2】Java Stream skip()

相關文章