V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yuankui
V2EX  ›  程序员

Java8 的 Stream 写是写的爽,但是一遇到抛异常的货,就感觉咯噔一下。。

  •  
  •   yuankui · 2019-05-22 15:21:13 +08:00 · 6373 次点击
    这是一个创建于 2040 天前的主题,其中的信息可能已经有所发展或是发生改变。
    什么优雅,干净都不复存在了。
    我 TMD 明明是个有追求的人,怎会写出这样的代码?

    第 1 条附言  ·  2019-05-22 16:26:31 +08:00
    第 2 条附言  ·  2019-05-23 15:36:36 +08:00
    用 Reactor 写了一把,这不就好起来了吗

    ```java
    Flux.range(1, 20)
    .map(n -> "http://adr.meizitu.net/wp-json/wp/v2/posts?page=" + n + "&per_page=100")
    .flatMap(url -> HttpClient.create()
    .baseUrl(url)
    .get()
    .responseContent()
    .aggregate()
    .asString()
    )
    .map(JSON::parseArray)
    .flatMap(Flux::fromIterable)
    .map(obj -> (JSONObject) obj)
    .map(obj -> obj.getString("thumb_src"))
    .doOnError(e -> {})
    .subscribe(System.out::println);
    ```
    29 条回复    2019-05-23 15:40:15 +08:00
    theTd
        1
    theTd  
       2019-05-22 15:31:19 +08:00
    用 Callable 的话是可以吃掉受检性异常的吧?
    xiaoidea
        2
    xiaoidea  
       2019-05-22 15:33:05 +08:00
    airfling
        3
    airfling  
       2019-05-22 15:39:42 +08:00 via Android
    你至少要把那三个出现可能异常的的点解决掉,不太建议代码都写在这一块。每个方法的代码尽量不超过 10 行
    mritd
        4
    mritd  
       2019-05-22 15:42:06 +08:00
    如果线上这一串出现了空指针啥的...
    yuankui
        5
    yuankui  
    OP
       2019-05-22 15:42:44 +08:00
    @xiaoidea 大意就是用一个不跑出 checkedException 的 lambda 去封装已有的咯?感觉还是咯噔。。
    yuankui
        6
    yuankui  
    OP
       2019-05-22 15:43:34 +08:00
    @mritd 那就哭呗~哈 stream.filter(Objects::nonNull)
    mooncakejs
        7
    mooncakejs  
       2019-05-22 15:45:15 +08:00   ❤️ 1
    io 相关感觉不太适合 stream,CompletableFuture 感觉更适合
    xinyewdz
        8
    xinyewdz  
       2019-05-22 15:46:05 +08:00
    这代码,看的人也是头大。
    BBCCBB
        9
    BBCCBB  
       2019-05-22 15:47:06 +08:00
    封装成一个方法,然后流里调该方法也许可破.
    BBCCBB
        10
    BBCCBB  
       2019-05-22 15:47:52 +08:00
    或者将相应的 Function, Consumer 放到外面声明
    chocotan
        11
    chocotan  
       2019-05-22 15:50:36 +08:00
    可以试下下 Try
    javaslang 里的
    passerbytiny
        12
    passerbytiny  
       2019-05-22 15:52:20 +08:00
    这是受检异常造成的,跟 Stream 有什么关系。而且你这个流干的东西也太多了吧,都要跨系统调用来获取数据了,这应该是高级流干的事,不应该是 API 级别的低级流干得事。
    BCy66drFCvk1Ou87
        13
    BCy66drFCvk1Ou87  
       2019-05-22 15:52:24 +08:00
    java 8 的新特性 lambda 也是搞得我懵逼,一堆箭头函数跟写 es6 一样……
    jinhan13789991
        14
    jinhan13789991  
       2019-05-22 15:57:26 +08:00 via Android
    要不~试试 rxjava ? 对异常处理友好~
    Sharuru
        15
    Sharuru  
       2019-05-22 15:59:59 +08:00
    流略长……不要把以前的宽度问题转换成高度问题啊- -
    x66
        16
    x66  
       2019-05-22 16:11:26 +08:00
    最怕的难道不是写了一大串,突然线上出一个空指针,根本找不到是哪一行的问题,那感觉简直绝望。
    yuankui
        17
    yuankui  
    OP
       2019-05-22 16:13:40 +08:00
    不要吐槽太长嘛,我就算是短成俩行,他遇到异常,还是得咯噔一下
    syhan
        18
    syhan  
       2019-05-22 16:16:40 +08:00
    Try+1
    reeco
        19
    reeco  
       2019-05-22 16:23:38 +08:00
    用 JOOL 处理 checked exception
    https://github.com/jOOQ/jOOL

    before:

    ```
    Arrays.stream(dir.listFiles()).forEach(file -> {
    try {
    System.out.println(file.getCanonicalPath());
    }
    catch (IOException e) {
    throw new RuntimeException(e);
    }

    // Ouch, my fingers hurt! All this typing!
    });
    ```

    after:

    ```
    Arrays.stream(dir.listFiles()).forEach(
    Unchecked.consumer(file -> { System.out.println(file.getCanonicalPath()); })
    );
    ```
    yuankui
        20
    yuankui  
    OP
       2019-05-22 16:26:47 +08:00
    @theTd 嗯嗯
    guyeu
        21
    guyeu  
       2019-05-22 16:55:23 +08:00
    代码组织有问题,流并不是所有地方都适用的。
    art2cat
        22
    art2cat  
       2019-05-22 17:00:09 +08:00
    effective java 里说不要超过三行,楼主这是入了魔啊
    yuankui
        23
    yuankui  
    OP
       2019-05-22 17:20:42 +08:00
    @art2cat 我不如地狱,谁入地狱😆
    yuankui
        24
    yuankui  
    OP
       2019-05-22 17:24:12 +08:00
    @passerbytiny 当然跟流有关系。

    `Stream.map(Function func)`
    拿 map 来说,map 方法签名中的 Function.apply 签名没有 throws Exception,所以就要求 function 实现必须把异常 catch 住。
    SoloCompany
        25
    SoloCompany  
       2019-05-22 21:39:47 +08:00
    java 自己给自己埋坑导致的, 语言层面的 checked exception 和 fp 就天然水土不服

    虽然这个坑完全是编译器造成的, 但为了兼容不得不一直坑下去

    fp 还是用 kotilin 吧
    ppaapc
        26
    ppaapc  
       2019-05-22 22:58:56 +08:00
    优化下格式 好好分割下还可以 stream 写着处理异常确实感觉有点蛋疼
    qiyuey
        27
    qiyuey  
       2019-05-23 09:28:38 +08:00 via Android
    没办法,上 Kotlin 吧
    encounter2017
        28
    encounter2017  
       2019-05-23 14:23:36 +08:00
    来学 scala 啊
    yuankui
        29
    yuankui  
    OP
       2019-05-23 15:40:15 +08:00
    附言格式乱了,还是截图好看些

    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2754 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:33 · PVG 21:33 · LAX 05:33 · JFK 08:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.