Java 项目该不该用 stream 流来编写代码?考虑 code viewer

2022-03-30 18:11:49 +08:00
 w741069229
8456 次点击
所在节点    Java
95 条回复
Leviathann
2022-03-31 14:49:33 +08:00
@NoKey 如果用上了比 java8 表达力还烂的语言且收入不是明显高出其他的话,那真的要反省一下自己了
HanMeiM
2022-03-31 15:13:59 +08:00
@w741069229 为啥不让用 optional ?我不是很明白,更喜欢不确定的空指针返回值吗? optional 在某些情况下更能表达返还值的稳定性。
uleh
2022-03-31 16:11:33 +08:00
对于工程化比较成熟的团队,只要你的局部小组里能维护好,用什么黑魔法其实都无所谓
但是如果是工程化比较弱的团队,请记住:安全第一! 😄
wupher
2022-03-31 17:26:59 +08:00
stream 绝对应该用。

ReactiveX 倒是可以考虑场景,值得商榷。
FrankHB
2022-03-31 18:49:04 +08:00
@RobberPhex @dreamramon @loryyang @byte10

提到的一些通病比这里说的原始问题更有毛病得多。

栈作为活动记录的一种实现,本来就用于隐藏过程运行时状态的实现细节。只有直接能在程序中显式访问活动记录的语言(比如至少得有 first-class one-shot continuation ),这种东西才配被要求是和程序员交互的标配。
说白了,在抽象能力弱鸡的语言里没事依赖栈帧是一种习惯性纵容实现泄露抽象的病。
特别是要知道 Java 不光不支持 continuation capture ,甚至连 proper tail call 都没有……设计 JVM 的丈育还用 stack inspection 当挡箭牌,结果差不多被正面打脸: https://stackoverflow.com/a/5097402
退一步讲,真是想要照顾调试体验,又不是 C 这种滥依赖 ABI 兼容的历史包袱,这么多年了连个 shadow stack 都不会实现的弟弟怎么好意思变成工业主流的?

算了,还是先停止把 stack 叫做什么劳什子“堆栈”开始吧。

(反思为什么 NPE PTSD 以及 optional 实质套娃的问题就不提了,本质算不上 Java 特色,虽然这年头也快成了 Java 特供问题了。)
hervey0424
2022-03-31 20:58:11 +08:00
C# 十年前都没有这种问题
lmshl
2022-03-31 21:13:44 +08:00
你们还在争论该不该用的时候,我的 5 个 Akka Stream 已经上线生产了。
ZStream / fs2 混着用表示看 Stream API 毫无压力😏
leeg810312
2022-04-01 08:34:11 +08:00
用循环写代码逻辑不清晰的人,用 stream 写一样不清晰,连 stream 都看不明白的没资格做代码审核
codeant
2022-04-01 08:38:01 +08:00
@w741069229 提这种要求的人也配叫大佬
Breadykid
2022-04-01 10:25:59 +08:00
@eb0c6551 你看的哪一版?
w741069229
2022-04-02 07:37:17 +08:00
@anzu 非常同意,但是这样做的结果就是,要么要写一个 predicate,把所有的判断逻辑放进去,这种会增加一定的理解度,但是我认为会有一定的效率提升;要么就要不停的.flilter ,这种得对原生的 api 有一定的了解,我认为好处就是代码比较清晰明了吧。那么这就引申了一个问题,哪种写法更好?
w741069229
2022-04-02 07:40:14 +08:00
@HanMeiM 理解难度吧,别人拿到代码不能直观的看出来,就比如 optional·ofNullbale 这个算子
TWorldIsNButThis
2022-04-06 23:20:43 +08:00
@w741069229 stream 的 map 跟 filter 都是无状态操作,所以串 n 个 filter 它也是遍历一遍
w741069229
2022-04-08 09:28:20 +08:00
感谢各位大佬的回复,我们就基于这个问题,站在`code review`的角度,和`debug`的角度,看下下面这段,

1. @TWorldIsNButThis 大佬说,`stream`的`filter`算子都是无状态的,这一点我同意,本质如下面这段代码,其实只有`map`和`flatmap`会引入时间的复杂度
2. 站在`review`的角度,如果我们要兼容向下的同学,那么这段代码是否存在复杂性的难度?
3. 站在`debug`的角度,我们是否引入了新的**断点**(就是`stream`是无状态的,导致断点其实有时候不太好懂)问题呢?譬如,`idea`可以使用`debug`中的计算器模式进行
4. 站在代码整个的观感角度,下面这段代码是否可以理解不具备代码简洁特性以及代码的整体都美感上
5. 站在代码的复用性上,我认为`steam`的代码其实是对业务有更高的要求,因为我觉得`stream`的复用性其实蛮低的,如果要改的话,就会牵一发而动全身.
6. 站在异常的处理上,我认为`stream`其实是在更严谨的要求一个编程人员对一段结果中产生异常的一个预判,我认为更能锻炼编码人员的功底吧

```java
Optional.ofNullable(search)
.map(SearchResponse::getHits)
.ifPresent(hits -> StreamSupport
.stream(hits.spliterator(), false)
.filter(Objects::nonNull)
.filter(SearchHit::hasSource)
.filter(this::filter)
.......会是 filter
.map(SearchHit::getSourceAsMap)
.filter(Objects::nonNull)
.map(Map::entrySet)
.flatMap(Collection::stream)
.filter(Objects::nonNull)
.map(this::map)
.forEach(.....)
);
```
以上是小弟对`stream`一点见解,希望大家能对我的看法进行批判和讨论吧
yoloMiss
2022-04-09 21:53:55 +08:00
这种情况建议抓紧润啊。

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

https://tanronggui.xyz/t/843929

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

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

© 2021 V2EX