黑客日教程-JAVA8 STREAM SKIP() VS LIMIT(),對STREAM切片

2021-01-14 黑客日

1.簡介

本文將討論Java Stream API的skip()和limit()方法,並突出它們的相似之處和不同之處。

儘管這兩個操作最初看起來非常相似,但它們實際上表現得非常不同並,且不可互換。實際上,它們是互補的,並且在一起使用時可以很方便。

2. skip()方法

skip方法是一個中間操作,跳過stream中的前n個元素,n不能為負值。如果n大於stream的大小,則返回空stream。

我們來看一個例子:

Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

.filter(i -> i % 2 == 0)

.skip(2)

.forEach(i -> System.out.print(i + " "));

上面的代碼中,獲取流中的偶數,並跳過前兩個。因此,我們的結果是:

6 8 10

上面的stream在執行的時候,forEach處理每個元素的時候,當到skip()的時候,skip知道前兩項必須被丟棄,因此它們不會將添加到結果流中。之後,它會創建並返回包含其餘項目的流。

為了做到這一點,skip()操作必須保持元素的狀態。出於這個原因,我們說skip()是一個有狀態操作。

3. limit()方法

limt(n)方法是另一種返回不超過請求大小的stream的中間操作。和上面一樣,n參數不能為負數。

我們在一個例子中使用它:

Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

.filter(i -> i % 2 == 0)

.limit(2)

.forEach(i -> System.out.print(i + " "));

在這種情況下,我們從我們的int流中只獲取兩個偶數:

2 4

與skip()操作一樣,limit()也是一個有狀態操作,因為它必須保持正在處理的項的狀態。

但與skip()消耗整個流不同,只要limit()達到最大項數,它就不再消耗任何項,只返回結果流。因此,我們說limit()是一種短路操作。

使用無限流時,limit()對於將流截斷為有限流非常有用:

Stream.iterate(0, i -> i + 1)

.filter(i -> i % 2 == 0)

.limit(10)

.forEach(System.out::println);

在這個例子中,我們將無限的數字流截斷為只有十個偶數的流。

4.結合skip()和limit()

正如我們前面提到的,skip和limit是互補的,如果將它們組合在一起,在某些情況下會非常有用。

想像一下,修改之前的示例,以便以10個為一組獲得偶數。我們可以通過在同一個流上同時使用skip()和limit()來實現:

private static List<Integer> getEvenNumbers(int offset, int limit) {

return Stream.iterate(0, i -> i + 1)

.filter(i -> i % 2 == 0)

.skip(offset)

.limit(limit)

.collect(Collectors.toList());

可以使用此方法輕鬆地對流進行分頁。即使這是非常簡單的分頁,也可以看到對stream進行切片操作是多麼強大。

5.結論

在這篇簡短的文章中,我們展示了Java Stream API 的skip()和limit()方法的相同點和不同點。還實現了一些簡單的示例來說明如何使用。

與往常一樣,GitHub上提供了示例的完整原始碼 。

編譯:baeldung java-stream-skip-vs-limit

相關焦點

  • 巧用Java8中的Stream,讓集合操作飛起來!
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫作者:堅持就是勝利juejin.im/post/5d5e2616f265da03b638b28a簡介
  • JAVA8 新特性詳解
    在Java 8之前一般某個函數應該返回非空對象但是偶爾卻可能返回了null,而在Java 8中,不推薦你返回null而是返回Optional。千萬記住使用limit方法,不然會無限列印下去。Stream 的創建需要指定一個數據源,比如 java.util.Collection的子類,List或者Set, Map不支持。Stream的操作可以串行執行或者並行執行。Java 8擴展了集合類,可以通過 Collection.stream() 或者 Collection.parallelStream() 來創建一個Stream。
  • 【外文翻譯】外國友人寫得很不錯的Java Lambda表達式入門教程,我終於翻譯好給大家啦!!!
    本人建議不要亂用, 因為這就和某些很高級的黑客寫的代碼一樣, 簡潔, 難懂, 難以調試, 維護人員想罵娘。謝謝!)Lambda 表達式是 Java SE 8 中一個重要的新特性。lambda 表達式允許你通過表達式來代替功能接口。
  • 最新JAVA業界流行資訊周報,2019年30期(7月),黑客日教程
    黑客日:Java菜鳥到高手,從關注業界最新動態開始!文中提到的資源查看地址,請百度搜索「黑客日教程 java周報」初級:SpringBoot JDBC示例GraphQL和Spring Boot入門把Spring Boot應用部署成WARIntelliJ IDEA插件.ignore作者Jakub Chrzanowski的專訪數據科學家和數據工程師的前五大Tableau在線課程和認證敏捷和測試為什麼不 (Robert
  • JAVA8——JAVA成長之路
    毫無疑問,Java 8發行版是自Java 5(發行於2004,已經過了相當一段時間了)以來最具革命性的版本。Java 8 為Java語言、編譯器、類庫、開發工具與JVM(Java虛擬機)帶來了大量新特性。在這篇教程中,我們將一一探索這些變化,並用真實的例子說明它們適用的場景。
  • JAVA IO Stream流總結
    Java中I/O操作主要是指使用 java.io 包下的內容,進行輸入、輸出操作。輸入也叫做讀取數據,輸出也叫做作寫 出數據。一.java.io.File 類1.4.2 字節輸出流【OutputStream】java.io.OutputStream 抽象類是表示字節輸出流的所有類的超類,將指定的字節信息寫出到目的地。它定義了字節輸出流的基本共性功能方法。l public void close() :關閉此輸出流並釋放與此流相關聯的任何系統資源。
  • CITY OF LAKES CLASSIC – AVAILABLE TO LIVE STREAM
    Fans can live stream all tournament games by clicking HERE and subscribing to the NFHSNetwork.新湖城籃球精英賽將於12月19日周六開賽,比賽將持續到12月22日周二。我們的首要任務是保證我們的學生、工作人員、教職員工、訪問隊和所有學校社區的健康。球迷和媒體都不允許進入現場觀看比賽。
  • 初識Spring Cloud Stream,什麼是消息驅動微服務框架
    spring cloud stream是一個構建與Spring Boot和Spring Integration之上的框架,方便開發人員快速構建基於Message-Driven的系統。Spring Cloud Stream官方提供了spring-cloud-stream-binder-kafka和spring-cloud-stream-binder-rabbit兩款主流消息中間件的Binder實現。並且還提供了專門用於測試的TestSupportBinder,開發者可以直接使用它來對通道的接收內容進行斷言測試。
  • Hditv 安卓電視APK 蘋果電視 iOS super stream player
    高速切片轉碼伺服器,全球CDN深度結合,迅捷播放,超低延時。蘋果商店內搜索安裝super stream player看得見 精彩超迅捷 體驗為您提供24小時體驗服務,7x12小時銷售專員恭候大駕。ios用戶請在app store內搜索 super stream player ,Android用戶請在play store內搜索HDiTV,或點擊下方按鈕下載應用。極致體驗,源自 專業HDiTV精選400+全球熱門頻道,涵蓋電影、紀實、新聞、體育、娛樂等多元內容。
  • Java8 中用法優雅的 Stream,性能也「優雅」嗎?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫ava8的Stream API可以極大提高Java程式設計師的生產力,讓程式設計師寫出高效率、乾淨、簡潔的代碼。那麼,Stream API的性能到底如何呢,代碼整潔的背後是否意味著性能的損耗呢?
  • Java中的IO與NIO
    字節流(byte stream)為處理字節的輸入和輸出提供了方便的方法,比如使用字節流讀取或者寫入二進位的數據。字符流(character stream)為字符的輸入和輸出提供了方便,採用了統一的編碼標準,因而可以國際化。值得注意的,在計算機的底層實現中,所有的輸入輸出其實都是以字節的形式進行的,字符流只是為字符的處理提供了具體的方法。
  • 程式設計師:java NIO模型,三大核心原理,不防來看看
    NIO(1)基本介紹1)Java NIO全程 java non-blocking IO,是指JDK提供的新API。從JDK1.4開始,Java提供了一系列改進的輸入/輸出的新特性,被統稱為NIO,是同步非阻塞的2)NIO相關類都被放在java.nio包及子包下,並且對原java.io包中的很多類進行改寫3)NIO有三大核心部分:Channel(通道),Buffer(緩衝區),Selector(選擇器)4)NIO是面向緩衝區,或者面向塊編程的。
  • Java 入門教程詳解
    本教程通過簡單的實例將讓大家更好的了解JAVA程式語言。Java 在線工具JDK 1.6 在線中文手冊我的第一個JAVA程序以下我們通過一個簡單的實例來展示 Java 編程,創建文件 HelloWorld.java(文件名需與類名一致), 代碼如下:實例public class HelloWorld { public
  • Java 代碼精簡之道
    精簡:importstatic java.lang.Math.PI;importstatic java.lang.Math.pow;importstatic java.util.stream.Collectors.toList;List
  • 給大忙人們看的 Java NIO 極簡教程
    4、limit寫模式下,表示最多能往Buffer寫多少數據。所以此時limit=capacity。讀模式時, limit表示最多能讀到多少數據。因此,當切換Buffer到讀模式時,limit會被設置成寫模式下的position值。即你能讀到之前寫入的所有數據(limit被設置成已寫數據的數量,這個值在寫模式下就是position)。
  • 【原創】在Java中使用Get/Post方式發送Http請求
    RESTfulClient工具類:package com.fsc.civet.mongo.util;import java.io.File;import java.io.IOException;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.List;import org.apache.http.Consts;import org.apache.http.HttpEntity;