Java中的函数式编程

如何在java中模拟函数式编程,特别是将函数映射到项集合?

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

什么是最简单和最尴尬的方式呢?

在Java 8中,函数式编程的所有尝试都将在Java中具有一些冗长和/或笨拙的部分。

直接的方法是提供一个Function接口(比如这个forms的Guava )并提供各种接受和调用它的方法(例如Collections#transfrom() ,它做了我认为你的map()方法应该做的事情) 。

糟糕的是你需要实现Function并且通常使用匿名内部类来实现,该内部类具有非常冗长的语法:

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

Lambda表达式 (在Java 8中引入)使这变得更加容易(并且可能更快)。 使用lambdas的等效代码如下所示:

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

或者更详细,但更灵活:

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

我已经将lambdaj和functionaljava用于此类事情。 而且可能有其他人……

只需使用类或接口将要应用的function包装在列表中即可。

 public interface Func { Object f(Object input); } public void map (Func func, Object[] arr) { for(int i=0;i 

正如您所说,Java不是为函数式编程而设计的,虽然您可以模拟它,但您必须真正想要这样做,即使它比使用Java中的标准编程更冗长,更尴尬。

以@Joachim为例。

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

这使用12个符号,不包括括号。 普通Java中的情况也是如此。

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

这使用7个符号。

您可以使用Java进行函数式编程,但是您应该期望它比使用Java的自然编程风格更加冗长和笨拙。

您可以下载计划于明年发布的OpenJDK 8,并使用新的Lambda Expressions进行function编程。 请参阅http://macgyverdev.blogspot.se/2012/10/functional-programming-in-java.html ,了解如何在Collection API中使用这些闭包,以及它们与Guava等Java 8之前的解决方案的比较。 LambdaJ。