Stream API จาก Java 8 เขียนใหม่บนตัววนซ้ำสำหรับ Java 7 และต่ำกว่า
Supplier
, Function
, Consumer
ฯลฯ );Stream
/ IntStream
/ LongStream
/ DoubleStream
(ไม่มีการประมวลผลแบบขนาน แต่มีวิธีการเพิ่มเติมที่หลากหลายและด้วยตัวดำเนินการแบบกำหนดเอง)Optional
/ OptionalBoolean
/ OptionalInt
/ OptionalLong
/ OptionalDouble
คลาส;Exceptional
- วิธีการจัดการกับข้อยกเว้นObjects
จาก Java 7 Stream . of ( /* array | list | set | map | anything based on Iterator/Iterable interface */ )
. filter (..)
. map (..)
...
. sorted ()
. forEach (..);
Stream . of ( value1 , value2 , value3 )...
IntStream . range ( 0 , 10 )...
โครงการตัวอย่าง: https://github.com/aNNiMON/Android-Java-8-Stream-Example
ต่างจากสตรีม Java 8 ตรงที่ Lightweight-Stream-API ให้ความสามารถในการใช้ตัวดำเนินการแบบกำหนดเอง
Stream . of (...)
. custom ( new Reverse <>())
. forEach (...);
public final class Reverse < T > implements UnaryOperator < Stream < T >> {
@ Override
public Stream < T > apply ( Stream < T > stream ) {
final Iterator <? extends T > iterator = stream . getIterator ();
final ArrayDeque < T > deque = new ArrayDeque < T >();
while ( iterator . hasNext ()) {
deque . addFirst ( iterator . next ());
}
return Stream . of ( deque . iterator ());
}
}
คุณสามารถหาตัวอย่างเพิ่มเติมได้ที่นี่
นอกเหนือจากตัวดำเนินการ Java 8 Stream ที่แบ็คพอร์ตแล้ว ไลบรารียังมี:
filterNot
- ตัวดำเนินการ filter
ที่ถูกปฏิเสธ
// Java 8
stream . filter ((( Predicate < String >) String :: isEmpty ). negate ())
// LSA
stream . filterNot ( String :: isEmpty )
select
- กรองอินสแตนซ์ของคลาสที่กำหนด
// Java 8
stream . filter ( Integer . class :: isInstance )
// LSA
stream . select ( Integer . class )
withoutNulls
- กรองเฉพาะองค์ประกอบที่ไม่เป็นโมฆะ
Stream . of ( "a" , null , "c" , "d" , null )
. withoutNulls () // [a, c, d]
sortBy
- เรียงลำดับตามฟังก์ชันตัวแยกข้อมูล
// Java 8
stream . sorted ( Comparator . comparing ( Person :: getName ))
// LSA
stream . sortBy ( Person :: getName )
groupBy
- จัดกลุ่มตามฟังก์ชันตัวแยก
// Java 8
stream . collect ( Collectors . groupingBy ( Person :: getName )). entrySet (). stream ()
// LSA
stream . groupBy ( Person :: getName )
chunkBy
- พาร์ติชันที่เรียงลำดับสตรีมตามฟังก์ชันลักษณนาม
Stream . of ( "a" , "b" , "cd" , "ef" , "gh" , "ij" , "klmnn" )
. chunkBy ( String :: length ) // [[a, b], [cd, ef, gh, ij], [klmnn]]
sample
- ปล่อยองค์ประกอบที่ n ทุกตัว
Stream . rangeClosed ( 0 , 10 )
. sample ( 2 ) // [0, 2, 4, 6, 8, 10]
slidingWindow
- พาร์ติชันจะสตรีมไปยังรายการขนาดคงที่และเลื่อนไปที่องค์ประกอบ
Stream . rangeClosed ( 0 , 10 )
. slidingWindow ( 4 , 6 ) // [[0, 1, 2, 3], [6, 7, 8, 9]]
takeWhile
/ dropWhile
- เปิดตัวใน Java 9 จำกัด/ข้ามสตรีมด้วยฟังก์ชันเพรดิเคต
Stream . of ( "a" , "b" , "cd" , "ef" , "g" )
. takeWhile ( s -> s . length () == 1 ) // [a, b]
Stream . of ( "a" , "b" , "cd" , "ef" , "g" )
. dropWhile ( s -> s . length () == 1 ) // [cd, ef, g]
scan
- ใช้ฟังก์ชันการสะสมซ้ำแล้วซ้ำอีกและส่งกลับ Stream
IntStream . range ( 1 , 6 )
. scan (( a , b ) -> a + b ) // [1, 3, 6, 10, 15]
indexed
- เพิ่มดัชนีให้กับทุกองค์ประกอบ ผลลัพธ์คือ IntPair
Stream . of ( "a" , "b" , "c" )
. indexed () // [(0 : "a"), (1 : "b"), (2 : "c")]
filterIndexed
/ mapIndexed
/ takeWhileIndexed
/ takeUntilIndexed
/ dropWhileIndexed
/ reduceIndexed
/ forEachIndexed
- ความเชี่ยวชาญที่จัดทำดัชนีของตัวดำเนินการ
Stream . of ( "a" , "b" , "c" )
. mapIndexed (( i , s ) -> s + Integer . toString ( i )) // [a0, b1, c2]
ไม่มีการลอง/จับที่น่าเกลียดอีกต่อไปในนิพจน์แลมบ์ดา
// Java 8
stream . map ( file -> {
try {
return new FileInputStream ( file );
} catch ( IOException ioe ) {
return null ;
}
})
// LSA
stream . map ( Function . Util . safe ( FileInputStream :: new ))
ดาวน์โหลดรุ่นล่าสุดหรือคว้าผ่าน Maven:
< dependency >
< groupId >com.annimon</ groupId >
< artifactId >stream</ artifactId >
< version >1.2.2</ version >
</ dependency >
หรือเกรเดิล:
dependencies {
.. .
implementation ' com.annimon:stream:1.2.2 '
.. .
}
หรือใช้คุณสมบัติที่ยังไม่เผยแพร่ล่าสุดกับ JitPack
รวมถึงเวอร์ชันสำหรับ Java ME ด้วย ชำระเงินสาขา javame