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

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

  • 1.skip() 示例
  • 2.skip() vs limit()
  • 参考文献

本页将介绍 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()

你可能感兴趣的:(Java编程,#,Java,8,java,stream,lambda)