2016-01-25 61 views
0

雖然與Java 8 Stream s工作,我有時發現Stream沒有我的願望(例如takeWhile()dropWhile()skipLast())的具體方法。我如何創建自己的流類,它具有額外的方法,無需重寫整個Java 8架構?一個方法添加到Java 8個流

我知道StreamEx庫,知道它有takeWhile()dropWhile()。在撰寫本文時,它沒有skipLast()。我已經爲此方法提交了an issue

一個可接受的解決方案是展示如何擴展Java 8 StreamStreamEx

+1

那麼你或許應該創建一個包裝類,寫自己的流框架 – Dici

+0

你可以創建索引和使用'流過濾器「來獲得你想要的索引,然後將其映射回實際的數據。例如,打印除數組中最後一個元素之外的所有內容,即IntStream.range(0,array.length).filter(i - > i!= array.length-1).mapToObj(i - > array [i])。的forEach(的System.out ::的println);'。但我認爲這不如@LouisWasserman的建議。 – gonzo

+0

我們這裏只是談論語法糖。不是靜態方法的粉絲,因爲它們是流語法的反模式。但是,如果只是一種方法,那麼包裝所有內容的成本是不可接受的 – Dici

回答

3

由於版本0.5.4 StreamEx庫有一個chain()方法。這允許創建插入舒適的輔助方法。

public static <T> UnaryOperator<StreamEx<T>> skipLast(int n) 
{ 
    return(stream -> skipLast(stream, n)); 
} 

private static StreamEx<T> skipLast(Stream<T> input, int n) 
{ 
    // implement the real logic of skipLast 
} 

通過上述,現在可以寫......

StreamEx. 
    of(input). 
    chain(skipLast(10)). 
    forEach(System.out::println); 
+2

請注意,OpenJDK錯誤跟蹤器中提供了相同的功能(請參閱[JDK-8140283](https://bugs.openjdk.java.net/browse/) JDK-8140283))。如果您喜歡,您可以在[OpenJDK郵件列表](http://mail.openjdk.java.net/mailman/listinfo/core-libs-dev)中爲它投票。 –