Java8 的函数式编程支持,我学习后觉得很沮丧和鸡肋

2019-10-10 19:16:07 +08:00
 zazalu

不知道是我问题还是什么,就感觉怪怪的

10813 次点击
所在节点    Java
72 条回复
xlui
2019-10-10 19:33:38 +08:00
您好,是你的问题,看一看没有函数式支持之前的代码就知道这东西解决了什么了。
oneisall8955
2019-10-10 20:11:18 +08:00
function 包用起来还是美滋滋的,将方法封装成对象,支持 lambda 表达式,用习惯了就改不回来了
qping
2019-10-10 20:20:46 +08:00
给你举个应用场景:
有个 list 想提取一部分字段转成一个 List<String>
```
List<TableInfo> tables = ...;
List<String> tableNames = ...;
for(TableInfo table : tables){
String tableName = table.getName().toUpperCase();
tableNames.add(tableName);
}
```

使用 lamda,只要一行:
```
List<String> tableNames = tables.stream().map(v -> v.getTableName().toUpperCase()).collect(Collectors.toList());
```

香不香
fuyufjh
2019-10-10 20:20:47 +08:00
要么___,要么___,scala 欢迎你
fuyufjh
2019-10-10 20:21:42 +08:00
@qping 这明明是使用了 stream api
godlovesxcjtest
2019-10-10 20:23:24 +08:00
@fuyufjh 但是这也是函数式编程啊
fuyufjh
2019-10-10 20:27:45 +08:00
@godlovesxcjtest 您对 FP 可能有误解
zhuangzhuang1988
2019-10-10 20:43:27 +08:00
@qping 不香, 代码没减多少, 而且更难看懂了,调试也不好,性能还不咋的.
hbsfxlz
2019-10-10 23:02:13 +08:00
@zhuangzhuang1988 难看懂的说明没有认真去了解过,stream 的可读性比 for 循环可读性强了一百倍
chendy
2019-10-10 23:20:04 +08:00
最常用的场景可能就是 StreamAPI 了
还好 idea 已经有 stream debugger 了,否则 debug 真的痛苦…
godlovesxcjtest
2019-10-10 23:57:23 +08:00
@fuyufjh 求指教。
taotaodaddy
2019-10-11 00:01:52 +08:00
java 的 fp 实现堪称是见过的颇不优雅
FireFoxAhri
2019-10-11 00:35:56 +08:00
你需要 scala
Senventise
2019-10-11 05:58:58 +08:00
@taotaodaddy 你这句子有语病啊
coldear
2019-10-11 06:26:32 +08:00
kotlin 吧
zazalu
2019-10-11 08:30:37 +08:00
@qping 这些简单的还能接受,确实简化了,主要是受不了那个 andThen()函数里产生函数的写法,觉得不是很直观
zazalu
2019-10-11 08:32:09 +08:00
```java
import java.util.function.*;

class I {
@Override
public String toString() { return "I"; }
}

class O {
@Override
public String toString() { return "O"; }
}

public class TransformFunction {
static Function<I,O> transform(Function<I,O> in) {
return in.andThen(o -> {
System.out.println(o);
return o;
});
}
public static void main(String[] args) {
Function<I,O> f2 = transform(i -> {
System.out.println(i);
return new O();
});
O o = f2.apply(new I());
}
}
```

这个既有趣又感觉我玩的是 java 吗?
araaaa
2019-10-11 08:52:46 +08:00
去用异步框架 vert.x 之类的
Jrue0011
2019-10-11 09:08:57 +08:00
@zazalu lambda 挺好用的,如果你觉得一段方法链用了很多个 lambda 太长的话,可以定义把这些方法抽出来定义成静态方法或者成员方法,通过方法引用传递
qping
2019-10-11 09:13:35 +08:00
@zhuangzhuang1988 #8 兄弟,你可以尝试用一下,一点也不复杂,当你了解后可读性并不差。最初我也是很抵制的,stream api 可以代替很多恶心的 for 循环的场景,用的飞起


@zazalu #16 从代码的可读性来说还是 Function 接口是有点复杂,这些接口更像是给底层架构设计使用的。有的东西只需要了解,然后能读懂其他人的代码就可以了,日常你可以不用嘛。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/607994

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX