生活随笔
收集整理的這篇文章主要介紹了
一文一起,学习功能强大的Java8新StreamAPI,让集合的操作得心应手
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄 Stream 概述 Stream 實例化 Stream 中間操作 Stream 終止操作
Stream 概述
Stream API ( java.util.stream) 把真正的函數式編程風格引入到Java中。這是目前為止對Java類庫最好的補充,因為Stream API可以極大提供Java程序員的生產力,讓程序員寫出高效率、干凈、簡潔的代碼。
Stream 是 Java8 中處理集合的關鍵抽象概念,它可以指定你希望對集合進行的操作,可以執行非常復雜的查找、過濾和映射數據等操作。 使用Stream API 對集合數據進行操作,就類似于使用 SQL 執行的數據庫查詢。也可以使用 Stream API 來并行執行操作。簡言之,Stream API提供了一種高效且易于使用的處理數據的方式。
實際開發中,項目中多數數據源都來自于Mysql,Oracle等。但隨著數據源豐富,有MongDB,Radis等,這些NoSQL的數據就需要Java層面去處理。
Stream 和 Collection 集合的區別:Collection 是一種靜態的內存數據結構,而Stream 是有關計算的。前者是主要面向內存,存儲在內存中,后者主要是面向 CPU,通過 CPU 實現計算。
Stream 是數據渠道,用于操作數據源(集合、數組等)所生成的元素序列。 “集合講的是數據,Stream講的是計算。”
注意: ①Stream 不會存儲元素。 ②Stream 不會改變源對象。其會返回一個持有結果的新Stream。 ③Stream 操作是延遲執行的。其會等到需要結果的時候才執行。
Stream 操作的三個步驟: ①Stream 實例化(創建):一個數據源(如:集合、數組),獲取一個流。 ②中間操作:一個中間操作鏈,對數據源的數據進行處理。 ③終止操作(終端操作):一旦執行終止操作,就執行中間操作鏈,并產生結果。之后,不能再被使用(需要的話需要另一個Stream)。
Stream 實例化
1、方式一:通過集合 Java8 中的 Collection 接口被擴展,提供了兩個獲取流的方法:
import java. util. ArrayList ;
import java. util. stream. Stream ; public class StreamAPITest { public static void main ( String [ ] args
) { List < String > arrayList
= new ArrayList < > ( ) ; arrayList
. add ( "aa" ) ; arrayList
. add ( "哈哈" ) ; arrayList
. add ( "99" ) ; Stream < String > stream1
= arrayList
. stream ( ) ; Stream < String > stream2
= arrayList
. parallelStream ( ) ; }
}
2、方式二:通過數組 Java8 中的 Arrays 的靜態方法 stream() 可以獲取數組流:
import java. util. Arrays ;
import java. util. stream. Stream ; public class StreamAPITest { public static void main ( String [ ] args
) { Double [ ] doubles
= { 1.1 , 2.0 , 4.3 , 9.9 } ; Stream < Double > stream
= Arrays . stream ( doubles
) ; }
}
3、方式三:通過Stream的of() 調用Stream類靜態方法 of(),通過顯示值創建一個流,其可接收任意數量的參數:
import java. util. stream. Stream ; public class StreamAPITest { public static void main ( String [ ] args
) { Double [ ] doubles
= { 1.1 , 2.0 , 4.3 , 9.9 } ; Stream < Double > doubles1
= Stream . of ( doubles
) ; Stream < ? extends Number > stream
= Stream . of ( 1 , 2 , 3 , 9.9 ) ; }
}
4、方式四:創建無限流 可以使用靜態方法 Stream.iterate() 和 Stream.generate() 創建無限流:
import java. util. stream. Stream ; public class StreamAPITest { public static void main ( String [ ] args
) { Stream < Integer > stream
= Stream . iterate ( 0 , x
-> x
+ 2 ) ; stream
. limit ( 10 ) . forEach ( System . out
:: println ) ; Stream < Double > stream1
= Stream . generate ( Math :: random ) ; stream1
. limit ( 10 ) . forEach ( System . out
:: println ) ; }
}
Stream 中間操作
多個中間操作可以連接起來形成一個流水線,除非流水線上觸發終止操作,否則中間操作不會執行任何的處理。而在終止操作時一次性全部處理,稱為“惰性求值”。
1、篩選與切片
import java. util. Arrays ;
import java. util. List ;
import java. util. stream. Stream ;
public class StreamAPITest { public static void main ( String [ ] args
) { List < String > arrayList
= Arrays . asList ( "aa" , "bb" , "cc" , "aa" ) ; Stream < String > stream
= arrayList
. stream ( ) ; stream
. filter ( e
-> ! e
. equals ( "aa" ) ) . forEach ( System . out
:: println ) ; System . out
. println ( "==========" ) ; arrayList
. stream ( ) . limit ( 2 ) . forEach ( System . out
:: println ) ; System . out
. println ( "==========" ) ; arrayList
. stream ( ) . skip ( 2 ) . forEach ( System . out
:: println ) ; System . out
. println ( "==========" ) ; arrayList
. stream ( ) . distinct ( ) . forEach ( System . out
:: println ) ; }
}
2、映射
import java. util. ArrayList ;
import java. util. Arrays ;
import java. util. List ;
import java. util. stream. Stream ;
public class StreamAPITest { public static void main ( String [ ] args
) { List < String > arrayList
= Arrays . asList ( "aa" , "bb" , "cc" , "aa" ) ; Stream < String > stream
= arrayList
. stream ( ) ; stream
. map ( x
-> x
. toUpperCase ( ) ) . forEach ( System . out
:: println ) ; System . out
. println ( "====================" ) ; arrayList
. stream ( ) . map ( StreamAPITest :: fromStringToStream ) . forEach ( System . out
:: println ) ; arrayList
. stream ( ) . flatMap ( StreamAPITest :: fromStringToStream ) . forEach ( System . out
:: println ) ; } public static Stream < Character > fromStringToStream ( String str
) { ArrayList < Character > arrayList
= new ArrayList < > ( ) ; for ( Character c
: str
. toCharArray ( ) ) { arrayList
. add ( c
) ; } return arrayList
. stream ( ) ; }
}
3、排序
import java. util. Arrays ;
import java. util. List ;
public class StreamAPITest { public static void main ( String [ ] args
) { List < Integer > list
= Arrays . asList ( 2 , - 9 , 0 , 22 , 6 , - 1 ) ; list
. stream ( ) . sorted ( ) . forEach ( System . out
:: println ) ; System . out
. println ( "===============" ) ; list
. stream ( ) . sorted ( ( e1
, e2
) -> - Integer . compare ( e1
, e2
) ) . forEach ( System . out
:: println ) ; }
}
Stream 終止操作
終端操作會從流的流水線生成結果。其結果可以是任何不是流的值,例如:List、Integer,甚至是 void 。流進行了終止操作后,不能再次使用。
1、匹配與查找
import java. util. Arrays ;
import java. util. List ;
import java. util. Optional ;
public class StreamAPITest { public static void main ( String [ ] args
) { List < Integer > list
= Arrays . asList ( 2 , - 9 , 0 , 22 , 6 , - 1 ) ; boolean allMatch
= list
. stream ( ) . allMatch ( e
-> e
> 0 ) ; System . out
. println ( allMatch
) ; boolean anyMatch
= list
. stream ( ) . anyMatch ( e
-> e
> 0 ) ; System . out
. println ( anyMatch
) ; boolean noneMatch
= list
. stream ( ) . noneMatch ( e
-> e
> 100 ) ; System . out
. println ( noneMatch
) ; System . out
. println ( "==========================" ) ; Optional < Integer > first
= list
. stream ( ) . sorted ( ) . findFirst ( ) ; System . out
. println ( first
) ; Optional < Integer > any
= list
. parallelStream ( ) . findAny ( ) ; System . out
. println ( any
) ; System . out
. println ( "==========================" ) ; long count
= list
. stream ( ) . filter ( e
-> e
> 0 ) . count ( ) ; System . out
. println ( count
) ; System . out
. println ( "==========================" ) ; Optional < Integer > max
= list
. stream ( ) . max ( Integer :: compare ) ; System . out
. println ( max
) ; Optional < Integer > min
= list
. stream ( ) . min ( ( e1
, e2
) -> Integer . compare ( e1
, e2
) ) ; System . out
. println ( min
) ; System . out
. println ( "==========================" ) ; list
. stream ( ) . forEach ( System . out
:: println ) ; }
}
2、歸約 map 和 reduce 的連接通常稱為 map-reduce 模式,因 Google 用它來進行網絡搜索而出名。
import java. util. Arrays ;
import java. util. List ;
import java. util. Optional ;
public class StreamAPITest { public static void main ( String [ ] args
) { List < Integer > list
= Arrays . asList ( 2 , - 9 , 0 , 22 , 6 , - 1 ) ; Integer reduce1
= list
. stream ( ) . reduce ( 0 , Integer :: sum ) ; Integer reduce11
= list
. stream ( ) . reduce ( 0 , ( e1
, e2
) -> e1
+ e2
) ; System . out
. println ( reduce1
) ; System . out
. println ( reduce11
) ; Optional < Integer > reduce2
= list
. stream ( ) . reduce ( Integer :: sum ) ; System . out
. println ( reduce2
) ; }
}
3、收集 Collector 接口中方法的實現決定了如何對流執行收集的操作(如收集到 List、Set、 Map)。另外, Collectors 實用類提供了很多靜態方法,可以方便地創建常見收集器實例,具體方法與實例如下表:
import java. util. Arrays ;
import java. util. List ;
import java. util. stream. Collectors ;
public class StreamAPITest { public static void main ( String [ ] args
) { List < Integer > list
= Arrays . asList ( 2 , - 9 , 0 , 22 , 6 , - 1 ) ; List < Integer > collect
= list
. stream ( ) . filter ( e
-> e
> 0 ) . collect ( Collectors . toList ( ) ) ; collect
. forEach ( System . out
:: println ) ; }
}
總結
以上是生活随笔 為你收集整理的一文一起,学习功能强大的Java8新StreamAPI,让集合的操作得心应手 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。