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

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

  •  1
     
  •   kosmosr · 241 天前 · 4379 次点击
    这是一个创建于 241 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    groupBy

    filter

    anyMatch

    allMatch


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

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

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

    https://github.com/hantsy/spring-webmvc-functional-sample
        43
    anakinsky   236 天前
    建议少用,隐藏了业务复杂性 可读性差 调试困难,自己爽的飞起,你新来的同事就苦逼了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4243 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 08:41 · PVG 16:41 · LAX 00:41 · JFK 03:41
    ♥ Do have faith in what you're doing.