博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java 8 新特性】Java Stream通过limit()获取前N条元素
阅读量:3762 次
发布时间:2019-05-22

本文共 2284 字,大约阅读时间需要 7 分钟。

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

在javadoc中的limit方法声明。

Stream
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
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
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
list = Arrays.asList("Varanasi", "Madurai", "Agartala"); list.parallelStream() .limit(2) .forEach(s->System.out.printf("%s ", s)); System.out.println("\n--- code 2 ---"); List
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

参考文献

转载地址:http://zagsn.baihongyu.com/

你可能感兴趣的文章
SpringCloud详细教程3-Eureka服务注册中心
查看>>
SpringMVC中常用的几个注解@RequestBody
查看>>
SpringCloud详细教程6-Zookeeper
查看>>
Freemarker使用mht制作导出word模板
查看>>
Freemarker使用xml写word模板-遇到的坑
查看>>
PyQt5基础用法ui转py后需要修改的地方
查看>>
Scanner类
查看>>
基本类型包装类
查看>>
System类常用方法
查看>>
Runtime类、Math类和Random类的常用方法
查看>>
数据处理类常用方法
查看>>
Collections和Character类 常用静态方法
查看>>
HTML之Javascript——BOM浏览器对象模型
查看>>
JAVA基础中的基础
查看>>
JDBC基础操作
查看>>
连接池
查看>>
Servlet的使用——重定向和转发
查看>>
JSP技术的使用——好像过时了唉。。。。。
查看>>
MVC模式概述
查看>>
Web之过滤器Filter
查看>>