Answers:
这取决于“功能编程”和“可能”的含义。
显然,您可以按照功能范例来实现事情。但是Java语言没有为其提供语法糖,因此某些事情充其量是乏味的,而另一些则极其神秘。
同样,您可以很好地用公认的非OO语言(例如C)编写面向对象的代码。
有一些库可以帮助您做到这一点,它们已经为您完成了繁琐的工作并隐藏了神秘的事物:
这些将使您能够使用功能更强大的方法以及可能更熟悉的语法和语义来编写Java代码,这正是FP功能语言所期望的。在合理的范围内。
显然,您可以在Java之上实现一种功能语言。这样您就可以将其用作FP语言。这是比您所要求的更高的抽象级别,但相对而言是在上下文中进行的(尽管我在这里作弊了,理所当然)。
例如,签出:
尽管它们可能并不是您真正想要的,但还有许多其他语言已移植到Java平台,这些语言可能使您摆脱Java相对不那么有趣的(是的,是双关语)的本质,并且已经为您提供了更多灵活性。诸如JRuby,Jython和Rhino(分别针对Ruby,Python和JavaScript / ECMAScript)的著名竞争者也为函数式编程提供了有趣的潜力,尽管它们在本质上并不是真正的函数式编程语言。JetBrains的科特林,虽然清楚地承认它不是一种功能语言,但它确实支持某些功能构造,也值得一看。
您可能还想阅读或观看以下文章或视频:
我正在读你提到的书。BTW真的很好。
是的,可以在Java中起作用。我不知道可以达到什么程度,但是可以实现许多功能编程习惯用法。
最重要的事情之一就是尝试以“不要改变状态”的心态进行编码。
例如,您使用final关键字来实现不变性。如果要使用数据结构,则应使用不可变的数据结构进行编码。Google Guava库已在执行此操作。
同样对于并发编程,您可以依赖Akka框架(参与者模型)。
值得一提的是,JVM字节码不支持(至少还不支持)尾调用优化,这对于函数式编程语言而言是非常重要的功能。
是的,绝对有可能,就像在任何图灵完整的语言/执行环境组合中一样。如果您知道自己在做什么,甚至可以使其表现良好。
不知道这有多明智。特别要注意的是,它并不是特别习惯(例如,它看起来很奇怪,您将不得不做一些非常规的事情,并使习惯于常规Java的人感到困惑)
您将得到一些看起来很奇怪的代码,例如,定义一个新函数:
Function twoStrings=new Function() {
public Object apply(Object param1) {
// do something to param1 and return a result
}
}
要进行函数式编程,通常需要:
因此,有可能将其作为一项练习,甚至是一个有趣的爱好项目。但是,您真的想做认真的函数式编程,同时又要保持JVM的优势/访问Java库,那么我认为Clojure是迄今为止最好的选择。
ps因为Clojure的核心实际上是用Java编写的,所以它实际上是一个非常有趣的案例示例,说明了如何在Java中进行函数式编程,同时又将复杂的细节隐藏在一种不错的新现代语言语法后面。感兴趣的人可以在GitHub上找到Clojure源代码。
在Java中可能有些功能。这样做非常痛苦。代替
myList.each { doSomething(it); }
你有类似的东西:
myList.each(new Function() { public void do(Object arg) { something(); }})
而且,如果您要使用闭包和函数作为一流的对象进行真正的函数式编程,请选择另一种语言。Scala,Clojure,Groovy都在JVM上运行,并且可以与旧版Java类进行交互。。
OpenJDK团队鼓励您下载其最新的OpenJDK 8二进制文件,并试用Collections API中引入的新lambda表达式和新功能惯用法(以及其他功能)。您可以采用清晰的功能样式进行编程。请参见“使用Java进行功能编程?” 与以前的Java8库(例如Guava,FunctionalJava和LambdaJ)进行JDK8 Collections比较。
似乎有可能,但它不是纯函数式编程。这可能会导致命令式编程。
毫无疑问,他为什么要提到海勒姆提到的可能的函数式编程。这里是:
这取决于“功能编程”和“可能”的含义。
函数式编程虽然有很多解释,但不能有不同的定义或含义。
像OOP一样,我们可以问“ OOP是什么意思?”。
肯定会有很多解释,但这仅涉及一个目标,即OOP的目标。
同样适用于函数式编程。
当我们说功能含义时,程序就是由功能组成的。
函数的作用是返回一个评估的参数/参数(参数是变量是调用函数时出现的表达式,而参数是函数声明中的一部分)。
当传递相同的参数时,函数也将始终返回相同的结果。这样,更容易避免错误或调试将来的错误。通过函数式编程,我们可以避免诸如修改全局变量之类的副作用。
JavaScript中的示例:
function increment(lis){
return lis.map(
function (x){
return x+2;
}
);
}
var myList = [4, 7, 2, 3];
console.log(increment(myList));
console.log(myList);
函数增量将1值添加到对象内部的每个元素并返回结果。myList的值没有改变,但是当我们调用函数时,我们看到了该对象元素的附加值。
作为我对Java中可能进行函数式编程的回应?,我相信不可能在Java中进行真正的功能编程。因为java实际上被设计为OOP,所以它在其中扩展了命令式编程并为可维护性进行了改进。当对象,变量等的状态发生变化时,这已经是必须进行的编程了。