Java ,现在工作中 stream 用的多吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kosmosr
V2EX    Java

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

  •  1
     
  •   kosmosr
    kosmosr 2019-04-13 14:43:44 +08:00 7059 次点击
    这是一个创建于 2429 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    43 条回复    2019-04-18 11:34:26 +08:00
    thisisgpy
        1
    thisisgpy  
       2019-04-13 14:58:27 +08:00   1
    没有 stream,我现在手里这个需求我能写成自闭症
    xyooyx
        2
    xyooyx  
       2019-04-13 14:58:57 +08:00
    list.forEach(x->{xxx}) 比较经常用,但是有时候需要维护一个计数 index 就不方便了,代码块里不允许可变变量
    lihongjie0209
        3
    lihongjie0209  
       2019-04-13 15:01:07 +08:00
    map

    groupBy

    filter

    anyMatch

    allMatch


    这些你用 for 循环写出来代码难看的要死。

    关键是后面你改代码的时候很舒服
    lihongjie0209
        4
    lihongjie0209  
       2019-04-13 15:01:54 +08:00   2
    @lqw3030
    可以使用 IntStream.range(0, list.size())..... 这样的方式操作索引
    kosmosr
        5
    kosmosr  
    OP
       2019-04-13 15:05:24 +08:00   1
    @lihongjie0209 是的 还有个 collect,写起来很方便 hhh
    loveCoding
        6
    loveCoding  
       2019-04-13 15:05:57 +08:00
    用习惯了之后,简直爽的飞起啊
    misaka19000
        7
    misaka19000  
       2019-04-13 15:08:59 +08:00 via Android   1
    我们 code review 如果发现可以使用 stream 的地方没使用会影响绩效
    Cbdy
        8
    Cbdy  
       2019-04-13 15:11:54 +08:00 via Android
    不仅用 stream,还用 vavr
    micean
        9
    micean  
       2019-04-13 15:13:30 +08:00
    看情况,stream 里只能抛 RuntimeException,包个 try catch 好难看……
    micean
        10
    micean  
       2019-04-13 15:14:20 +08:00
    另外也不能 return 到外层
    kotlin 对此做了一些糖
    hantsy
        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 方便。
    dyxLike
        12
    dyxLike  
       2019-04-13 15:18:25 +08:00
    网上说不用并行流的情况下 stream foreach 的效率比循环要低, 不知道大家是怎么看的?
    Cbdy
        13
    Cbdy  
       2019-04-13 15:18:44 +08:00 via Android
    @micean 你需要 vavr
    rb6221
        14
    rb6221  
       2019-04-13 15:23:18 +08:00
    foreach map filter findFirst
    这几个用的最多
    lihongjie0209
        15
    lihongjie0209  
       2019-04-13 15:31:03 +08:00   2
    @dyxLike 你觉得机器值钱还是人值钱,而且只要你一直升级 jvm, 这些性能问题在 jvm 层面都帮你解决了。 前几年还说不能用字符串拼接呢
    allanzhuo
        16
    allanzhuo  
       2019-04-13 15:49:48 +08:00
    刚开始用,感觉很香。
    wysnylc
        17
    wysnylc  
       2019-04-13 16:00:36 +08:00
    @lihongjie0209 #4 Stream.iterate(0, item -> item + 1).limit(10).forEach(
    hodur
        18
    hodur  
       2019-04-13 16:31:18 +08:00
    用得很爽,不过现在这个项目用的还是 java7
    xiaweiyang
        19
    xiaweiyang  
       2019-04-13 17:08:07 +08:00 via Android
    你同事是不想学,stream 好用的飞起,可以节省不少时间,然后好划水。
    passerbytiny
        20
    passerbytiny  
       2019-04-13 17:13:06 +08:00
    早就想用了,不过优先级排的很靠后,应该属于 Java 8 新特性中最晚启用的,毕竟要非常大地改变编码习惯。
    honeycomb
        21
    honeycomb  
       2019-04-13 17:13:48 +08:00 via Android
    @hantsy
    spring webflux 在某些模块上用着好香,相比之下 Java 自带的 future 就别扭多了。

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

    https://github.com/hantsy/spring-webmvc-functional-sample
    anakinsky
        43
    anakinsky  
       2019-04-18 11:34:26 +08:00
    建议少用,隐藏了业务复杂性 可读性差 调试困难,自己爽的飞起,你新来的同事就苦逼了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2737 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 13:33 PVG 21:33 LAX 05:33 JFK 08:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86