Java ,现在工作中 stream 用的多吗

2019-04-13 14:43:44 +08:00
 kosmosr

我个人在工作中基本都是用 stream 来代替 foreach 处理数据的,代码简洁了好多。。 但是我同事基本还是用 foreach 处理的,不知道大家、周围用这个的多不多

6427 次点击
所在节点    Java
43 条回复
honeycomb
2019-04-13 17:13:48 +08:00
@hantsy
spring webflux 在某些模块上用着好香,相比之下 Java 自带的 future 就别扭多了。

@dyxLike stream foreach 性能低一些无所谓啊,真的连这里的性能都要榨的话,后期再改。
bumz
2019-04-13 17:21:11 +08:00
@dyxLike #12 充分优化,stream 效率比 foreach 更高,因为 iterator 需要很多不必要的边界检查,这些是基于 spliterator 的 stream 不需要的。不过 stream 的效率需要 partial escape analysis 的支持,这个 graalvm 已经有了,新版 jvm 也在开始有
leonme
2019-04-13 18:05:38 +08:00
stream 很好用
NeinChn
2019-04-13 18:38:30 +08:00
@lihongjie0209
机器值钱,如果觉得人比机器值钱,只能说明服务规模太小了
而且稍大一点的公司,三五年都不会更新 JDK(大版本)...
不过 for 循环这个损耗确实...有点小....不是极端场景可以基本忽略....
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
mooncakejs
2019-04-13 18:58:32 +08:00
没有 js/ts 爽。
feiyuanqiu
2019-04-13 19:07:30 +08:00
说句题外话,filter 这名字取得真不好,每次用的时候脑子都要转个弯,我觉得它应该叫 retain
再增加一个 predict 为 true 时抛弃元素的方法,叫 filter 就贴切了
lihongjie0209
2019-04-13 19:59:59 +08:00
@NeinChn 要是机器值钱的话可以直接用 c++, 而不是纠结用 for 还是 foreach
lihongjie0209
2019-04-13 20:04:46 +08:00
@RobberPhex
1. stream 逻辑复杂和几百行的函数一样,都可以通过提取函数的方式重构
2. idea 中有 stream debug 插件可以看看
3. stream 多数情况下就是做三个操作 map reduce filter,你只需看 stream 的返回值就可以了, 一般不需要到 stream 的内部 debug
mreasonyang
2019-04-13 20:56:18 +08:00
@dyxLike 按网上测评确实有差距,但高 QPS 亲测,对于 IO 密集型业务来说可以忽略不计。CPU 密集型的没实测过不好说,但个人感觉对于绝大部分业务来说也是可以接受的。
zek
2019-04-13 21:08:20 +08:00
strem 可读性差一点吧
k9990009
2019-04-13 21:09:45 +08:00
stream 很好用 ,仅仅是 foreach,就没必要用了。
map groupBy filter reduce sort limit 写起来很爽
bduqw
2019-04-13 21:18:31 +08:00
kotlin 了解一下,跟 Java 一块写爽的一批,spring 官方也支持
aleung
2019-04-13 21:22:54 +08:00
@zek 其实可读性更好,但前提是要先跨过函数式思维的门槛
agagega
2019-04-13 21:39:18 +08:00
@feiyuanqiu Ruby 里面叫 select 和 reject,我觉得很贴切
x7395759
2019-04-14 00:13:44 +08:00
最近用得越来越多了。
eslizn
2019-04-14 00:16:43 +08:00
steam 用的挺多的,下班后经常用。。。
TheBestSivir
2019-04-14 00:48:06 +08:00
@zek 为什么这么觉得。。。天哪
wineway
2019-04-14 00:50:09 +08:00
用的不多,都是直接.asScala
taaaang
2019-04-14 09:45:09 +08:00
爽到飞起

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

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

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

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

© 2021 V2EX