【Java 8 新特性】Java Stream通过limit()获取前N条元素

102 篇文章 73 订阅

Stream的limit方法返回一个新的流,该流的元素被截断为给定的最大长度。limit方法包含前n个元素,其中n小于或等于给定的最大大小。

在javadoc中的limit方法声明。

Stream<T> limit(long maxSize) 

参数:参数maxSizelimit返回的流中的最大元素数。
返回limit方法返回新的流。
异常:如果参数maxSize输入类型不正常,则该方法抛出IllegalArgumentException

limit方法是一种短路状态的中间操作(short-circuiting stateful intermediate operation)。

流操作分为中间作业和终端作业,并结合起来形成流管道。如果中间操作可以为无限输入生成有限流,则它是短路(short-circuiting)。中间操作分为无状态操作和有状态操作。

在处理诸如filtermap这样的新元素时,无状态操作不会保留以前看到的元素的状态。

有状态操作可以在处理诸如distinctlimit之类的新元素时合并以前看到的元素的状态。

注意limit方法在顺序流管道上是一种低消耗的操作,对于有序的并行管道,尤其是对于maxSize值较大的管道,其代价可能很高。这是因为limit(maxSize)被绑定返回遇到顺序中的第一个maxSize元素,而不是任何maxSize数字元素。

下面我们来看一些limit方法的例子

示例1
假设我们有一个数字流,并对其调用limit方法。

Stream.of(11, 12, 13, 14, 15).limit(3)
   .forEach(s->System.out.println(s)); 

源流有5个数字,我们调用了limit(3),最大大小是3。因此,我们的输出将从第一个元素开始最多3个元素,即11 12 13。

如果limit的最大大小大于元素个数,则stream中的所有元素都将被limit方法选中。

Stream.of("A", "B", "C", "D").limit(10)
   .forEach(s->System.out.println(s));

我们可以看到源流有4个元素,而我们调用的limit的最大大小是10。这里limit将返回包含所有元素的流,输出将是 A B C D。

示例2
我们再看一个例子

LimitDemo2.java

package com.concretepage;
import java.util.Arrays;
import java.util.List;
public class LimitDemo2 {
  public static void main(String[] args) {
	System.out.println("--- code 1 ---");    
	List<String> list = Arrays.asList("Vijay", "Suresh", "Vinod");
	list.stream()
	  .map(e -> "Mr. " + e)
	  .limit(2)
	  .forEach(s->System.out.printf("%s ", s));

	System.out.println("\n--- code 2 ---");
	List<Integer> numList = Arrays.asList(31, 32, 33, 34);
	numList.stream()
	  .mapToInt(i -> i * 10)
	  .limit(3)
	  .forEach(s->System.out.printf("%s ", s));
  }
} 

输出

--- code 1 ---
Mr. Vijay Mr. Suresh 
--- code 2 ---
310 320 330 

示例3
在并行流中的limit方法的例子

LimitDemo3.java

package com.concretepage;
import java.util.Arrays;
import java.util.List;
public class LimitDemo3 {
  public static void main(String[] args) {
	System.out.println("--- code 1 ---");    
	List<String> list = Arrays.asList("Varanasi", "Madurai", "Agartala");
	list.parallelStream()
	  .limit(2)
	  .forEach(s->System.out.printf("%s ", s));

	System.out.println("\n--- code 2 ---");
	List<Integer> numList = Arrays.asList(41, 42, 43, 44);
	numList.parallelStream()
	  .mapToInt(i -> i * 10)
	  .limit(3)
	  .forEach(s->System.out.printf("%s ", s));
  }
} 

输出

--- code 1 ---
Madurai Varanasi 
--- code 2 ---
420 410 430 

参考文献

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫巳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值