2009-11-19 50 views
5

我想實現一個懶惰的序列(意味着下一個項目只在你調用step函數時計算),它應該有的一個方法是「map」,它接收一個函數影響所有成員。最優雅的方法是使用函數組合,並將新函數分配給函數變量,但由於函數不是Java中的第一類值,所以我不知道如何執行此操作。在Java中的函數組合

我想過有一個類只包含一個函數,就像一個「函數指針」包裝器,但我看不出如何用於合成。

編輯:問題是家庭作業有關。 另外,它應該能夠處理沿着地圖(地圖(地圖(stepFunction())))(在這種情況下爲「地圖」,通過方法「地圖」給出的功能)的線條上的多個構圖。

+0

所以,當你說你想要做的地圖(地圖(地圖(stepFunction()))),這是否意味着你有列表的列表,並且你想調用stepFunction的每個元素的所有該層次中的子列表?我仍然不完全清楚你想要完成什麼。 – 2009-11-19 21:50:52

+0

不可以。基本上這是一筆交易:在任何給定時間,我只有三件事:階梯函數,當前值和基值。如果Seq.map(someFunctionToMapWith)從未應用過,則當前值= base value = stepFunction(以前的基值)。但是,一旦映射應用於序列,每次調用seq.tail()更改當前值時,首先更改基本值並使用給定的函數進一步改變它:curr = mapFunc(stepFunc(base value ))(基值也被更新)。如果地圖被多次調用,它應該是map(map(.. map(stepFunc(base value))..))。 – EpsilonVector 2009-11-20 08:04:09

回答

5

歡迎來到Java及其痛苦。

interface Function<T> { 
    public T eval(T argument); 
} 

class Lazy<T> { 
    private Iterator<T> source; 
    private Function<T> filter; 
    Lazy(final Iterator<t> source, final Function<T> filter) { 
     this.source = source; 
     this.filter = filter; 
    } 
    public T step() { 
     return filter.eval(source.next()); 
    } 
} 
+0

我不明白這是如何幫助我的作品。 也許我應該提到它應該能夠響應map()的多個應用程序。我想要實現的行爲是map(map(map(map(stepFunction())))(例如)。 – EpsilonVector 2009-11-19 21:29:40

+0

然後讓懶惰擴展迭代器 ...這個想法是給你一個指向正確方向的指針,而不是寫所有的代碼! – 2009-11-19 21:34:42

+0

@EpsilonVector考慮使它成爲一個流暢的界面,所以:'stepFunction().map(Functor).map(Functor).take(5)'或者其他 – 2013-11-28 12:46:43

1

在Java中,你總是用類協議來做到這一點。請參見java.lang.Thread以及規範示例的運行功能。 Java中沒有「函數指針」或「函數變量」。

-1
public static <T> void apply(final List<T> list, final Function<T> func) 
{ 
    for(final T val : list) 
    { 
     func.perform(val); 
    } 
} 

interface Function<T> 
{ 
    void apply(T value); 
} 

class DisplayFunction<T> 
    implements Function<T> 
{ 
    public void perform(T value) 
    { 
     System.out.println(value); 
    } 
} 

該調用apply(list,new DisplayFunction());

+0

和沒有理由的隨機下標仍然會發生。如果你認爲某些事情是錯的,那麼解釋你爲什麼這麼想很有禮貌。 – TofuBeer 2009-11-19 21:49:15

+0

這可能是因爲它沒有回答這個問題,它問如何編寫兩個函數,而不僅僅是使用一個地圖。而且,函數並不實際修改它們的輸入,它們會返回一個單獨的轉換值。 – 2009-12-15 22:11:00

+0

您可以將其更改爲public static R apply(final列表 list,final Function func)使其返回不同的值(或者如果返回值相同,則刪除R並將T用作返回值)。通常我不會直接回答作業......但這個答案應該足以讓事情開始。 – TofuBeer 2009-12-15 22:22:42

5

Google Collections具有Function類型,Functions.compose(Function, Function)的方法,該方法Iterables.transform(Iterable, Function),等等。

如果這是作業(我真的希望每個人都會在他們的問題與家庭作業有關時透露)對你沒有幫助。

+0

這是作業相關的。 – EpsilonVector 2009-11-19 21:25:51

0

FWIW,Java中等效的「函數指針」是帶有單一方法的接口。您可以使用某個類實現接口,該類提供了方法的實現,然後存儲對該類對象的引用。

將引用更改爲另一個實現方法不同的類對象相當於將函數指針更改爲指向不同的函數。