2011-05-11 44 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的自然编程风格更加冗长和尴尬。