V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kosmosr
V2EX  ›  Java

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

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

    我个人在工作中基本都是用 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,我现在手里这个需求我能写成自闭症
    lqw3030
        2
    lqw3030  
       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
    janus77
        14
    janus77  
       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 也在开始有
    leonme
        23
    leonme  
       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,我觉得很贴切
    x7395759
        36
    x7395759  
       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   ·   实用小工具   ·   1189 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:24 · PVG 02:24 · LAX 10:24 · JFK 13:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.