JDK17 都出来了,感觉现在很多资深程序员 Stream 不会, Lambda 不会, Java .time 包不会

2022-07-11 14:27:31 +08:00
 qwerthhusn

不少资深人士写代码的时候还是各种 for 循环。

Lambda 也不用,还用各种匿名内部类。

还有 JDK8 的时期时间库,很多人还是在用 Date ,Calender 。现在的 LocalDate, LocalDateTime, YearMonth, ZonedDateTime 做时间计算真的特别直观简单,但是他们就喜欢用 Date ,简单的计算就用毫秒加减,复杂点的计算就先换成 Calender ,完事后再转换回 Date 。

甚至 JDK7 的 try-with-resources 语法我都感觉不少人都不知道。

所以,现在“JDK8 是主流”这句话是不对的,而是“JVM8 是主流”才是对的。语法的主流应该是 J2SE 1.5 。

16462 次点击
所在节点    Java
185 条回复
sampeng
2022-07-11 18:23:38 +08:00
@nothingistrue

当数据量级小的时候二者没区别,当数据量级上去之后,stream API 对性能更好。

这个问题是你自己做的测试得来的,还是网上说的?
sampeng
2022-07-11 18:25:17 +08:00
说 stream api 可读性更高的是熟悉 stream api 的可读性更高。不熟悉的就是看天书。
for while 怎么了。。这还能有原罪了?
zhuangzhuang1988
2022-07-11 18:31:23 +08:00
会又能咋样,能写个类似 lucene 么,或者 h2 么 这些可是在 jdk8 之前就出来了
zhuangzhuang1988
2022-07-11 18:33:44 +08:00
@sampeng 对的<effective java>上就有讨论,
第 45 条:谨慎使用 Stream 159
第 46 条:优先选择 Stream 中无副作用的函数 164
第 47 条:Stream 要优先用 Collection 作为返回类型 168
第 48 条:谨慎使用 Stream 并行 172

有的时候 stream 写出来的真是天书
https://book.douban.com/subject/30412517/
dcsuibian
2022-07-11 18:35:31 +08:00
1 、Lambda 是肯定要用的,要不然多麻烦
2 、时间的我也喜欢用时间戳计算然后转成 Instant (时间段长度固定,与时区无关的情况下)。其它几个用的比较少,数据库里存的和返回给前端的都是毫秒时间戳,交给前端去格式化。但 Date 、Calendar 肯定不用。
3 、try-with-resources 会用,但用的不多。因为如果你调用的方法会抛出检查型异常的话,那么放在开头的括号里的很麻烦。(我倾向于方法生命无 throws )
4 、stream api 用的挺多的,但 for 也在用。
因为 stream 中间有个函数会抛出检查型异常的话,处理也比较麻烦,不优雅。或者只是 steam api 用得太多了。

只考虑 LTS 版 Java ,现在开新项目已经可以直接上 Java 11 了。
那乐观估计,2025 年至少得开始学 Java 17 了。

顺便问一下,学新版本是只看新的部分还是直接重学当复习比较好呢?
wfd0807
2022-07-11 18:40:51 +08:00
说 stream 可读性高应该是用于简单场景,数据逻辑复杂聚合操作,代码格式化都是个问题,就不用说可读性
stream 可以简化一些简单的循环、归集操作,真没有必要上纲上线
如何能用最快的方式达到目的才是值得关注的问题
lixintcwdsg
2022-07-11 18:46:06 +08:00
主要这些细节提升不了多少生产力。
一般来说一个项目,编码可能就占 15%,大头在前期预研,项目价值,架构设计,项目管理沟通等等上面(大公司)
编码一些新特性生产力提高 15%,对于整个项目就是 2.25%的提高
kett
2022-07-11 19:19:07 +08:00
你觉得是那就是吧
adoal
2022-07-11 19:37:40 +08:00
也许人家在 stream 流行之前就已经修齐治平迎娶白富美了
lawler
2022-07-11 19:45:08 +08:00
年轻人没有写过复杂功能时的意淫罢了了,就像 c 看不上 java 一样,c 在尽善尽美。

之所尽可能的减少使用 stream 是因为某一天,我需要从一个 list 中计算多个维度的数据。
我发现循环过滤分组再过滤取属性计算 sum/avg/cont 后代码很屎。
从此,凡是需要 stream 处理时,我会优先考虑我需要几个 stream 。超过两次就直接 for 了。

至于 lambda ,再设计了大量单一方法的接口后,发现也很鸡肋。只是为了使用 lambda 而设计,但却定义了大量的单接口方法,一单出现补充接口方法,就有各种问题。从此只在 jdk 中使用,不再在自己定义可以使用 lambda 的接口。


不可避免的,当涉及复杂系统应用的时候,这些语法糖没有任何意义。
你看 spring 源码,有大范围在使用这些特性么?
wenbinwu
2022-07-11 20:07:42 +08:00
别纠结语言框架,这东西只有熟练不熟练的问题
基础懂了,随便换,就是个看文档的问题

如果一个人说我一天写 10 个小时代码,那他写的代码肯定是烂的
把自己想成工程师,而不是码农,把时间花在思考上,而不是写代码上
securityCoding
2022-07-11 20:12:33 +08:00
这几个类库不会确实有点离谱了
ddonano
2022-07-11 20:13:20 +08:00
jdk 11 和 17 有啥新特性,只会用 jdk8
ElegantOfKing
2022-07-11 20:21:34 +08:00
我专门学过这些东西,项目中也多多少少会用到相关的特性。
但是,但是哈,一旦遇到复杂的逻辑,我就大概率不用,或者用了,但是做很多注释。
实在是有些特性太抽象,对于后面维护的人来说,是个累赘。
felixcode
2022-07-11 20:34:48 +08:00
新版本新功能绝对是不稳定的,刚参加工作那段时间的软件和版本都是最稳定的,年轻人不要一味的追求时髦,新功能一般都是没用的。
狗头;)
dongcxcx
2022-07-11 20:47:54 +08:00
这个并不是什么大不了的东西,项目里如果有的话直接就用了,没有看一下也很快就会了.

所以这个不会能咋的,会了又能咋的.
nutting
2022-07-11 21:11:31 +08:00
那些风格的代码看不惯,不像 java
zpxshl
2022-07-11 21:39:56 +08:00
你一天的时间有多少在编码的,少写几行代码真能让你更摸鱼吗。
反正我编码时间不到 1/10
aliveyang
2022-07-11 21:48:05 +08:00
只在简单场景用过 stream
xiaowangge
2022-07-11 22:16:45 +08:00
据说,蚂蚁金服某组是禁止使用 Lambda 的

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

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

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

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

© 2021 V2EX