我个人在工作中基本都是用 stream 来代替 foreach 处理数据的,代码简洁了好多。。 但是我同事基本还是用 foreach 处理的,不知道大家、周围用这个的多不多
1
thisisgpy 2019-04-13 14:58:27 +08:00 1
没有 stream,我现在手里这个需求我能写成自闭症
|
2
lqw3030 2019-04-13 14:58:57 +08:00
list.forEach(x->{xxx}) 比较经常用,但是有时候需要维护一个计数 index 就不方便了,代码块里不允许可变变量
|
3
lihongjie0209 2019-04-13 15:01:07 +08:00
map
groupBy filter anyMatch allMatch 这些你用 for 循环写出来代码难看的要死。 关键是后面你改代码的时候很舒服 |
4
lihongjie0209 2019-04-13 15:01:54 +08:00 2
@lqw3030
可以使用 IntStream.range(0, list.size())..... 这样的方式操作索引 |
5
kosmosr OP @lihongjie0209 是的 还有个 collect,写起来很方便 hhh
|
6
loveCoding 2019-04-13 15:05:57 +08:00
用习惯了之后,简直爽的飞起啊
|
7
misaka19000 2019-04-13 15:08:59 +08:00 via Android 1
我们 code review 如果发现可以使用 stream 的地方没使用会影响绩效
|
8
Cbdy 2019-04-13 15:11:54 +08:00 via Android
不仅用 stream,还用 vavr
|
9
micean 2019-04-13 15:13:30 +08:00
看情况,stream 里只能抛 RuntimeException,包个 try catch 好难看……
|
10
micean 2019-04-13 15:14:20 +08:00
另外也不能 return 到外层
kotlin 对此做了一些糖 |
11
hantsy 2019-04-13 15:16:54 +08:00 1
Stream, Completablefuture, Optional 在 Java 8 是最常见的。Spring Data JPA ( JPA 2.2 )早已经支持 Stream, Optional 返回结果。
现在已经将工作环境切换到 Java11,Optional 现在支持 map, flatMap 了,var 类型推断,List.of, Map.of 等开始用了。 不过 Future,Completablefuture 用起来不舒服,没有 Reactor API 方便。 |
12
dyxLike 2019-04-13 15:18:25 +08:00
网上说不用并行流的情况下 stream foreach 的效率比循环要低, 不知道大家是怎么看的?
|
14
janus77 2019-04-13 15:23:18 +08:00
foreach map filter findFirst
这几个用的最多 |
15
lihongjie0209 2019-04-13 15:31:03 +08:00 2
@dyxLike 你觉得机器值钱还是人值钱,而且只要你一直升级 jvm, 这些性能问题在 jvm 层面都帮你解决了。 前几年还说不能用字符串拼接呢
|
16
allanzhuo 2019-04-13 15:49:48 +08:00
刚开始用,感觉很香。
|
17
wysnylc 2019-04-13 16:00:36 +08:00
@lihongjie0209 #4 Stream.iterate(0, item -> item + 1).limit(10).forEach(
|
18
hodur 2019-04-13 16:31:18 +08:00
用得很爽,不过现在这个项目用的还是 java7
|
19
xiaweiyang 2019-04-13 17:08:07 +08:00 via Android
你同事是不想学,stream 好用的飞起,可以节省不少时间,然后好划水。
|
20
passerbytiny 2019-04-13 17:13:06 +08:00
早就想用了,不过优先级排的很靠后,应该属于 Java 8 新特性中最晚启用的,毕竟要非常大地改变编码习惯。
|
21
honeycomb 2019-04-13 17:13:48 +08:00 via Android
|
22
bumz 2019-04-13 17:21:11 +08:00
@dyxLike #12 充分优化,stream 效率比 foreach 更高,因为 iterator 需要很多不必要的边界检查,这些是基于 spliterator 的 stream 不需要的。不过 stream 的效率需要 partial escape analysis 的支持,这个 graalvm 已经有了,新版 jvm 也在开始有
|
23
leonme 2019-04-13 18:05:38 +08:00 via Android
stream 很好用
|
24
NeinChn 2019-04-13 18:38:30 +08:00
@lihongjie0209
机器值钱,如果觉得人比机器值钱,只能说明服务规模太小了 而且稍大一点的公司,三五年都不会更新 JDK(大版本)... 不过 for 循环这个损耗确实...有点小....不是极端场景可以基本忽略.... |
25
RobberPhex 2019-04-13 18:42:23 +08:00
想用来着,但是 stream 还是有几个问题的:
1. 复杂逻辑,一套就出现了很长的缩进。“火箭式代码”,就在刚刚发现项目里出现了 stream+lamda,8 级缩进😂 2. stream+lamda 打断点,如何查看 return 的值呢?比如: ``` Collectors.toMap( info -> Optional.ofNullable(processKey(info)), info -> Optional.ofNullable(processValue(info)) ) ``` 我想每次在 map 里加一个 pair 的时候停下来,并知道刚刚 /将要添加的 pair 是啥。 --- 另外,谈谈我的理解,不对的话,请及时斧正。 stream 在简单的数据转换时很有用,比如将 List<String>转换成 List<Long> 面对复杂逻辑,就需要 stream+lamad/function 了,类似函数式。 但是函数式的缺点就在于,1. 人的理解一般是指令式的,函数式很绕。2. debug 的时候,不好 debug |
26
mooncakejs 2019-04-13 18:58:32 +08:00 via iPhone 1
没有 js/ts 爽。
|
27
feiyuanqiu 2019-04-13 19:07:30 +08:00 via Android
说句题外话,filter 这名字取得真不好,每次用的时候脑子都要转个弯,我觉得它应该叫 retain
再增加一个 predict 为 true 时抛弃元素的方法,叫 filter 就贴切了 |
28
lihongjie0209 2019-04-13 19:59:59 +08:00
@NeinChn 要是机器值钱的话可以直接用 c++, 而不是纠结用 for 还是 foreach
|
29
lihongjie0209 2019-04-13 20:04:46 +08:00
@RobberPhex
1. stream 逻辑复杂和几百行的函数一样,都可以通过提取函数的方式重构 2. idea 中有 stream debug 插件可以看看 3. stream 多数情况下就是做三个操作 map reduce filter,你只需看 stream 的返回值就可以了, 一般不需要到 stream 的内部 debug |
30
mreasonyang 2019-04-13 20:56:18 +08:00 via iPhone
@dyxLike 按网上测评确实有差距,但高 QPS 亲测,对于 IO 密集型业务来说可以忽略不计。CPU 密集型的没实测过不好说,但个人感觉对于绝大部分业务来说也是可以接受的。
|
31
zek 2019-04-13 21:08:20 +08:00 via iPhone
strem 可读性差一点吧
|
32
k9990009 2019-04-13 21:09:45 +08:00 via Android
stream 很好用 ,仅仅是 foreach,就没必要用了。
map groupBy filter reduce sort limit 写起来很爽 |
33
bduqw 2019-04-13 21:18:31 +08:00 via Android
kotlin 了解一下,跟 Java 一块写爽的一批,spring 官方也支持
|
35
agagega 2019-04-13 21:39:18 +08:00 via iPhone
@feiyuanqiu Ruby 里面叫 select 和 reject,我觉得很贴切
|
36
x7395759 2019-04-14 00:13:44 +08:00
最近用得越来越多了。
|
37
eslizn 2019-04-14 00:16:43 +08:00
steam 用的挺多的,下班后经常用。。。
|
38
TheBestSivir 2019-04-14 00:48:06 +08:00
@zek 为什么这么觉得。。。天哪
|
39
wineway 2019-04-14 00:50:09 +08:00 via iPhone
用的不多,都是直接.asScala
|
40
taaaang 2019-04-14 09:45:09 +08:00
爽到飞起
|
41
sagaxu 2019-04-14 09:55:55 +08:00 via Android
2015 年开始用 stream,2017 年开始迁移到 kotlin
|
42
hantsy 2019-04-14 12:09:55 +08:00
@bduqw 我不觉得 Kotlin 写程序会爽很多。Java 8 以后,语法方面一直借鉴了其他语言的优秀设计,已经大大简化了。
https://github.com/hantsy/spring-webmvc-functional-sample |
43
anakinsky 2019-04-18 11:34:26 +08:00
建议少用,隐藏了业务复杂性 可读性差 调试困难,自己爽的飞起,你新来的同事就苦逼了
|