2011-05-11 61 views
10

如何模擬Java中的函數式編程,特別是將某個函數映射到一組項目中?
Java中的函數式編程

 
map(func, new String[]{"a","b","c"}); 

什麼是最詳細的&尷尬的方式做到這一點?

回答

9

不幸的是函數式編程的所有嘗試都將有詳細和/或尷尬一些零件,將它在Java中。

直接方法是提供一個Function接口(如this one form Guava),並提供各類稱取方法和調用它(如Collections#transfrom()它做什麼,我覺得你map()方法應該做的)。

約壞事是,你需要實現Function並經常與一個匿名內部類,它有一個非常詳細的語法這樣做:

Collection<OutputType> result = Collections.transform(input, new Function<InputType,OutputType>() { 
    public OutputType apply(InputType input) { 
     return frobnicate(input); 
    } 
}); 

應當指出的是,爪哇計劃LAMBDA功能8將使這相當容易(甚至可能更快!)。在等效代碼的lambda(目前形式)是這樣的:

Collection<OutputType> result = Collections.transform(input, SomeClass::frobnicate); 

或更詳細的,但更靈活:

Collection<OutputType> result = Collections.transform(input, in -> frobnicate(in)); 
2

只是包裝要應用列表中的功能與類或接口。

public interface Func { 
    Object f(Object input); 
} 

public void map (Func func, Object[] arr) { 
    for(int i=0;i<arr.legnth;i++) { 
    arr[i] = func.f(arr[i]); 
    } 
} 

map(
    new Func() { public Object f(Object input) { return input; } };, 
    new String[]{"a","b"}); 
1

正如你是,Java不適合函數式編程,雖然你可以效仿它,你要真想做到這一點,即使是更詳細的比Java中使用標準的編程更加尷尬。

Take @ Joachim的例子。

Collection<OutputType> result = Collections.transform(input, new Function<InputType,OutputType>() { 
    public OutputType apply(InputType input) { 
     return frobnicate(input); 
    } 
}); 

這使用12個符號,不包括近括號。在普通的Java中看起來是一樣的。

List<OutputType> list = new ArrayList(); 
for(InputType in: input) 
    list.add(frobnicate(in)); 

這使用7個符號。

您可以用Java編寫函數式編程,但您應該期望它比使用Java的自然編程風格更加冗長和尷尬。