9

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

 2 years ago
source link: https://www.v2ex.com/t/843929
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Java

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

  w741069229 · 1 天前 via iPhone · 5145 次点击
87 条回复    2022-03-31 21:13:44 +08:00

vate32

vate32      1 天前   ❤️ 2

为什么不用,用来处理集合效率多高。“考虑 code viewe”,不会有人看不懂吧

golangLover

golangLover      1 天前 via Android

用 foor loop 的可读性太差了

LeonL1

LeonL1      1 天前

虽然可读性确实不太好,但是写起来确实爽啊

chendy

chendy      1 天前

具体情况具体分析,没有固定标准
有的地方直接循环更清晰,有些地方 stream 更简洁

fengpan567

fengpan567      1 天前

stream 就是简洁明了啊

xianzhe

xianzhe      1 天前 via Android

离了 stream 不会写了

lostpg

lostpg      1 天前 via Android   ❤️ 1

我觉得使用 stream 是更明晰的

SurfaceView

SurfaceView      1 天前

never use.

xuanbgxuanbg      1 天前

我觉得更清晰

keshawnvan

keshawnvan      1 天前

可读性提高了,code review 不应该更简单吗?

eb0c6551

eb0c6551      1 天前   ❤️ 3

请看《 Effective Java 》 Item 45 : Use streams judiciously

kingfalse

kingfalse      1 天前 via Android

review 的人不是得起码能看得懂 stream.....

kingfalse

kingfalse      1 天前 via Android   ❤️ 1

或许该考虑换人 review 了?

pengtdyd

pengtdyd      1 天前   ❤️ 8

人写出来的代码是给人看的,不是给某些蠢货看的

Samuelcc

Samuelcc      1 天前

合理地使用 Stream 只会让可读性更好。
只会不合理使用的人换别的写法可读性也不会高到哪里去。。

w741069229

w741069229      1 天前 via iPhone

@pengtdyd 但是公司的大佬不让用 stream 和 optional 这些用法

luckyrayyy

luckyrayyy      1 天前

stream 也不是所有情况下都可读性更好的....不是非常复杂的 stream ,我觉得都可以用

MakHoCheung

MakHoCheung      1 天前

@w741069229 听大佬的,如果你想用就用一遍然后删了改回 foreach

TWorldIsNButThis

TWorldIsNButThis      1 天前 via iPhone

idea 可以一键把 stream 转成 for

gabon

gabon      1 天前

@MakHoCheung intellij idea 可以自动把简单的 stream 转换为 for loop 。

TWorldIsNButThis

TWorldIsNButThis      1 天前 via iPhone

@w741069229 那建议他们转 go 永远不升 1.18 的那种

adoal

adoal      1 天前 via iPhone

@w741069229 换个新大佬

chnyuwen

chnyuwen      1 天前

离了 stream 不会写了 +1

gam2046

gam2046      1 天前

@w741069229 #16 有没有一种可能,大佬对项目不够熟悉,目测,看不出类型推导的具体结果,就导致大佬不知道你在干啥。

w741069229

w741069229      1 天前

@gam2046 我是新接的,我之前都是梭哈 stream 流,通篇的那种,但是新公司入职后,就不让用了

pofycn

pofycn      1 天前

能用 steam 梭的统统用 stream 梭 管他呢 [狗头]

zmal

zmal      1 天前

你司大佬排斥 stream 的原因无非这么几条:
1. 可读性差。理论上 lambda 范式的代码可读性会更好。如果可读性变差了,说明姿势不太对,业务逻辑和控制逻辑没有分离。
2. 性能损耗。据说相比 for loop 大约 15%的性能损失。但对业务代码来说是可接受的。
3. 不便调试。这个要看具体案例,个人认为不是问题。
4. 老派守旧。无解,建议换公司。

searene

searene      1 天前

Stream 出来都多少年了,这都看不懂就不要 review 代码了吧

Vegetable

Vegetable      1 天前

笑死,这么多人不明白什么叫可读性是吧。
Stream 确实不错,但是最好少用 lambda ,把代码写短不是本事,写清楚才是。

Vegetable

Vegetable      1 天前   ❤️ 1

Reviewer 欠你的,在网页上一行一行给你走读代码?

tohuer00

tohuer00      1 天前

得考虑团队整体水平,防止水平差的同事瞎用,干脆一刀切禁掉省事。比如楼上很多一把梭的我看就很危险。

EscYezi

EscYezi      1 天前 via iPhone   ❤️ 3

steam filter map 等 api 语义不比 for 来 for 去清晰多了
顺便推荐 vavr 库,更简洁更清晰

v2eb

v2eb      1 天前 via Android

想看下可读性差的 stream 流形式代码是怎么写的。

gtx990

gtx990      1 天前 via Android   ❤️ 2

Java 的完全没问题,Scala 的吐了

lux182

lux182      1 天前

想知道不用等理由

Rocketer

Rocketer      1 天前 via iPhone

这是要照顾纯 Java 6 程序员么?哪怕是写过 JS 的也能看懂 stream 吧?

yazinnnn

yazinnnn      1 天前

你们前端也禁用 lambda 吗?

RobberPhex

RobberPhex      1 天前

用 stream (甚至用函数式编程)都会遇到一个问题,就是堆栈不可回溯了。你只能看到这个 stream 的栈,再往上就看不到上一个 stream/lambda 了,只能看到 stream 库的栈了。
所以我个人觉得,单个语句中,stream 可以用一次,不能再多。

当然,回到问题,公司项目,怎么约定就怎么来,协作重要。

Jooooooooo

Jooooooooo      1 天前   ❤️ 1

里面抛个空指针不好查.

echo1937

echo1937      1 天前 via iPhone

@v2eb 我见过把整个业务逻辑写在一个 map()里面的

WebKit

WebKit      1 天前 via Android

stream 不止简洁,的性能更好

Hider5

Hider5      1 天前 via iPhone

Stream 可读性好,但空指针问题不好排查

w741069229

w741069229      20 小时 28 分钟前 via iPhone

@EscYezi 哈哈哈哈哈。我一直在用

wxyrrcj

wxyrrcj      19 小时 48 分钟前 via Android

多好用 为啥不用

dreamramon

dreamramon      19 小时 31 分钟前   ❤️ 1

出了空指针,堆栈不好查。

aptupdate

aptupdate      19 小时 17 分钟前 via iPhone

前段时间有个奇葩需求要对集合各种过滤、排序、分组,当时就感叹要是没有 stream 我得累个半死。
所以这种省时省力的方法为什么不用呢? NPE 问题确实麻烦,不过新版 idea 里有个流调试器,直接可视化处理过程。

micean

micean      18 小时 47 分钟前

stream 的 lambda 里面要精炼、简洁到不可能出现 NPE 问题

cweijan

cweijan      18 小时 33 分钟前

stream 还是要用的, 但是有的程序员水平低, 用 stream 写的代码可读性极差.

neptuno

neptuno      18 小时 7 分钟前

看不懂 stream ,这个水平 review 了有啥用吗

ychost

ychost      17 小时 52 分钟前

stream 结合 Optional 用起来美滋滋,C# 的 Linq 更加的纯粹舒服

arthas2234

arthas2234      17 小时 27 分钟前

stream 挺好用的,用来处理集合再适合不过啦。说看不懂的,可读性差的,是没用过的吧

nothingistrue

nothingistrue      17 小时 25 分钟前

Stream 及 Lambda 表达式的第一优点就是代码简洁,这跟 code review 是正相关,不是互斥的。

不过 Lambda 表达式能无缝转接,Stream 不能。Stream 使用的是数据流逻辑,跟传统的“判断、循环……”逻辑有区别,转换过去需要学习。但是这个学习成本不大,而且如果是数据结构 /算法已经很溜的,早就回了压根不用学。大佬刚开始不让用,可能还是要考虑团队管理,大佬要是一直不让用,那他 100%是假大佬。

Huelse

Huelse      17 小时 18 分钟前

哪来那么多可读性问题?是你自己“懒”吧?

yor1g

yor1g      17 小时 11 分钟前

java 8 都多少年了 还抱着 java6 么

superchijinpeng

superchijinpeng      17 小时 9 分钟前

Why not ?

Loku

Loku      17 小时 5 分钟前

stream 都 jdk1.8 的东西了。 现在 jdk1.18 了。

loryyang

loryyang      17 小时 4 分钟前   ❤️ 1

可以,但,注意别过于复杂
我对代码的认知就是,这代码写完,过段时间,你自己能不能很快地看懂,看不懂就说明写得不好。要不改逻辑,要不写注释

最后,stream 也有上面提到的堆栈问题,一般不建议做非常复杂的操作

xwayway

xwayway      17 小时 2 分钟前

可以,但是不要过长,一句话完成一个目的,需要写得太长了,那样就成裹脚布了。

Torpedo

Torpedo      17 小时 0 分钟前

@pengtdyd 好像两方都认为自己才是人,对方是蠢货

bertonzh

bertonzh      16 小时 53 分钟前

22 年了大概只有 Java 圈才会出现这种问题...

byte10

byte10      16 小时 53 分钟前

@RobberPhex 这个是核心问题,一直觉得 stream 有哪里不对,原来在你这里。😄

intmax2147483647

intmax2147483647      16 小时 51 分钟前

说抛空指针不好查的的🤣你不知道在流中对空的处理吗

dayudayupao

dayudayupao      16 小时 45 分钟前

Stream 需要什么可读性,跟业务逻辑代码比起来,这几个集合操作的复杂度有啥,还是把重心放在业务逻辑代码的清晰上来吧,这种语法糖怎么可能承载太多逻辑

Magentaize

Magentaize      16 小时 32 分钟前 via iPhone   ❤️ 2

在 stream 里说 NPE ,栈的怕是不会正确使用 stream ?

anzu

anzu      16 小时 23 分钟前

看情况,禁止在调用链中写一堆代码,类似 .filter(d -> { /*这里有 10 行代码*/ })

clf

clf      16 小时 23 分钟前

stream 除了一些小坑( localthread 相关)外,都挺好的。对于可读性的提升也是很大的,相对来说,可以很清晰的知道这份 stream 输出的数据经过了哪些流程。

nulIptr

nulIptr      15 小时 57 分钟前   ❤️ 3

2022 年是 linq 发布的第 14 年,stream api 发布的第 8 年。居然还有人讨论这个问题。

fewok

fewok      15 小时 33 分钟前

2022 年了,其实可提出,该不该用 java 了,毕竟其他编程语言也是不错的

WispZhan

WispZhan      14 小时 55 分钟前 via Android

你们是不是都不屑写 ut ,单元测试?

selca

selca      14 小时 28 分钟前

读个 lambda 都读不明白,啥 reviewer ,水准这么低

uSy62nMkdH

uSy62nMkdH      14 小时 14 分钟前

建议上一段你们产生争议的代码看看。

zbatman

zbatman      13 小时 58 分钟前

@fewok 我觉得所有公司应该立马把 Java 写的业务系统全撤了,换成其他不错的编程语言,直接让 Java 进垃圾堆

mauve

mauve      13 小时 34 分钟前

程序员就该写程序员该写的东西!

zw1one

zw1one      13 小时 28 分钟前

没必要一刀切,写 for 也有写得恶心的,不是 stream 的问题,是写的人有没有维护代码可读性意识的问题。

siweipancc

siweipancc      13 小时 19 分钟前 via iPhone

不应该用范型,注解也不该用,毕竟大佬可以不学,你不可以不听他的话

NoKey

NoKey      13 小时 7 分钟前

@vate32 先不说能不能用;处理集合效率高,这个值得讨论讨论。。。

NoKey

NoKey      13 小时 6 分钟前

@WebKit 性能更好从何说起?

NoKey

NoKey      13 小时 0 分钟前

太多一刀切的说法,还有说因为不让用 stream 直接换公司的。。。
学 java 的同时,学习一下其他语言
各种语言提供的语法糖不同
如楼上有人说的,如果没有 stream ,各种分组,过滤,排序就不会写了
这实际上是有问题的
当然,要觉得自己这辈子在程序员这路上,只用 java ,且都在 1.8 版本以上,那也没啥问题

TWorldIsNButThis

TWorldIsNButThis      12 小时 47 分钟前 via iPhone

@EscYezi 还有 eclipse collections
Java 官方视频拿 java17 的 stream 跟它对比,说难道更好的抽象(指 eclipse collections )一定会有更差的性能吗?结论为不是,因为 eclipse collections 在他们给出的几个用例下抽象更好且速度也更快 XD

Leviathann

Leviathann      12 小时 31 分钟前

@NoKey 如果用上了比 java8 表达力还烂的语言且收入不是明显高出其他的话,那真的要反省一下自己了

HanMeiM

HanMeiM      12 小时 6 分钟前

@w741069229 为啥不让用 optional ?我不是很明白,更喜欢不确定的空指针返回值吗? optional 在某些情况下更能表达返还值的稳定性。

uleh

uleh      11 小时 9 分钟前

对于工程化比较成熟的团队,只要你的局部小组里能维护好,用什么黑魔法其实都无所谓
但是如果是工程化比较弱的团队,请记住:安全第一! 😄

wupher

wupher      9 小时 53 分钟前

stream 绝对应该用。

ReactiveX 倒是可以考虑场景,值得商榷。

FrankHB

FrankHB      8 小时 31 分钟前

@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 特供问题了。)

hervey424840

hervey424840      6 小时 22 分钟前

C# 十年前都没有这种问题

lmshl

lmshl      6 小时 7 分钟前

你们还在争论该不该用的时候,我的 5 个 Akka Stream 已经上线生产了。
ZStream / fs2 混着用表示看 Stream API 毫无压力😏

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK