如何模擬Java中的函數式編程,特別是將某個函數映射到一組項目中?
Java中的函數式編程
map(func, new String[]{"a","b","c"});
什麼是最詳細的&尷尬的方式做到這一點?
如何模擬Java中的函數式編程,特別是將某個函數映射到一組項目中?
Java中的函數式編程
map(func, new String[]{"a","b","c"});
什麼是最詳細的&尷尬的方式做到這一點?
不幸的是函數式編程的所有嘗試都將有詳細和/或尷尬一些零件,將它在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));
我已經使用lambdaj和functionaljava這類東西。而且有可能是別人...
只是包裝要應用列表中的功能與類或接口。
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"});
正如你是,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的自然編程風格更加冗長和尷尬。
您可以下載定於明年發佈的OpenJDK 8,並使用新的Lambda表達式進行函數式編程。請參閱http://macgyverdev.blogspot.se/2012/10/functional-programming-in-java.html以獲取如何在Collection API中使用這些閉包以及如何與Guava和LambdaJ之前的Java 8解決方案進行比較的示例。