返回信息流今天写一个算法Java用了150行,C语言用了60行,就和一同学讨论Java和c语言的算法,同学提到了函数式语言,说他经常用sml写算法,很少超过10行。
我还是第一次听说函数式语言,这类语言是递归代替循环,网上查了查发现没什么中文资料,同学提到java也在强行添加函数式特性,以后函数式天然的并行会替代面向对象,是未来的方向,对此我表示很疑惑,希望各位大神能发表一下自己的看法。
这是一条镜像帖。来源:北邮人论坛 / java / #48563同步于 2016/3/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[讨论]关于函数式编程
weifan
2016/3/15镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
Haskell是一种纯函数式编程语言,它的命名源自美国数学家Haskell Brooks Curry,他在数学逻辑方面上的工作使得函数式编程语言有了广泛的基础。Haskell语言是1990年在编程语言Miranda的基础上标准化的,并且以λ演算为基础发展而来。这也是为什么Haskell语言以希腊字母“λ”(Lambda)作为自己的标志。Haskell语言的最重要的两个应用是Glasgow Haskell Compiler (GHC)和Hugs(一个Haskell语言的编译器)。本语言的特式是利用很简单的叙述就可以完成链表、矩阵等数据结构。
sml 好像是standard ml吧。。貌似年岁很久了的样子。。
感觉sml啊Prolog啊这种是学术界自己写出来用的编程语言
c是工业界为了自己写程序造出来的语言
java是为了让别人写程序造出来的语言。。。
【 在 weifan 的大作中提到: 】
: 今天写一个算法Java用了150行,C语言用了60行,就和一同学讨论Java和c语言的算法,同学提到了函数式语言,说他经常用sml写算法,很少超过10行。
: 我还是第一次听说函数式语言,这类语言是递归代替循环,网上查了查发现没什么中文资料,同学提到java也在强行添加函数式特性,以后函数式天然的并行会替代面向对象,是未来的方向,对此我表示很疑惑,希望各位大神能发表一下自己的看法。
函数式编程的历史几乎和编程语言本身一样悠久。最早的函数式编程是LISP,1959年左右就出现了,仅仅比Fortran晚。
函数式编程天生比命令式编程更高级,更适合解决“大”的问题,更容易写出正确的程序,但不太容易去严格地控制执行的速度。但将来,优化器会越来越强大,程序的规模也越来越大,函数式编程的优势会越来越明显。
Java1.8加入了lambda表达式,这样很多函数式语言很容易表达的意思(比如高阶函数)也可以在Java中表达(Spring用户表示太幸福了!)。但毕竟Java不是函数式语言,lambda的语义还是等价于匿名内部类的语义。
楼主学学Haskell吧。比SML更纯粹一些,适合初学者。而且学了以后可以写出更好的C/Java代码。
至于中文资料……只要高中毕业的人,读英文应该没问题,不用担心。推荐免费在线教材Learn You A Haskell: http://learnyouahaskell.com/
其实换换思考方式也挺有意思的
public static void main(String... args) {
class User {
String name;
User(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
"}\t";
}
}
List<User> users = new ArrayList<User>() {{
for (int i = 0; i < 5; i++) {
add(i % 2 == 0 ? null : new User(String.format("name:%d", i)));
}
}};
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
if (user == null) {
continue;
}
System.out.print(user);
}
System.out.println();
for (User user : users) {
if (user == null) {
continue;
}
System.out.print(user);
}
System.out.println();
users.forEach(user -> {
if (user != null) {
System.out.print(user);
}
});
System.out.println();
users.stream().filter(user -> user != null).forEach(user1 -> System.out.print(user1));
System.out.println();
users.stream().filter(Objects::nonNull).forEach(System.out::print);
}