• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yuankui
V2EX  ›  程序员

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

  •  
  •   yuankui · May 22, 2019 · 7754 views
    This topic created in 2723 days ago, the information mentioned may be changed or developed.
    什么优雅,干净都不复存在了。
    我 TMD 明明是个有追求的人,怎会写出这样的代码?

    Supplement 1  ·  May 22, 2019
    Supplement 2  ·  May 23, 2019
    用 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 replies  •  2019-05-23 15:40:15 +08:00
    theTd
    theTd
    May 22, 2019
    1
    用 Callable 的话是可以吃掉受检性异常的吧?
    airfling
    airfling
    May 22, 2019 via Android
    3
    你至少要把那三个出现可能异常的的点解决掉,不太建议代码都写在这一块。每个方法的代码尽量不超过 10 行
    mritd
    mritd
    May 22, 2019
    4
    如果线上这一串出现了空指针啥的...
    yuankui
    yuankui
    OP
    May 22, 2019
    5
    @xiaoidea 大意就是用一个不跑出 checkedException 的 lambda 去封装已有的咯?感觉还是咯噔。。
    yuankui
    yuankui
    OP
    May 22, 2019
    6
    @mritd 那就哭呗~哈 stream.filter(Objects::nonNull)
    mooncakejs
    mooncakejs
    May 22, 2019❤️1
    7
    io 相关感觉不太适合 stream,CompletableFuture 感觉更适合
    xinyewdz
    xinyewdz
    May 22, 2019
    8
    这代码,看的人也是头大。
    BBCCBB
    BBCCBB
    May 22, 2019
    9
    封装成一个方法,然后流里调该方法也许可破.
    BBCCBB
    BBCCBB
    May 22, 2019
    10
    或者将相应的 Function, Consumer 放到外面声明
    chocotan
    chocotan
    May 22, 2019
    11
    可以试下下 Try
    javaslang 里的
    passerbytiny
    passerbytiny
    May 22, 2019
    12
    这是受检异常造成的,跟 Stream 有什么关系。而且你这个流干的东西也太多了吧,都要跨系统调用来获取数据了,这应该是高级流干的事,不应该是 API 级别的低级流干得事。
    BCy66drFCvk1Ou87
    BCy66drFCvk1Ou87
    May 22, 2019
    13
    java 8 的新特性 lambda 也是搞得我懵逼,一堆箭头函数跟写 es6 一样……
    jinhan13789991
    jinhan13789991
    May 22, 2019 via Android
    14
    要不~试试 rxjava ? 对异常处理友好~
    Sharuru
    Sharuru
    May 22, 2019
    15
    流略长……不要把以前的宽度问题转换成高度问题啊- -
    x66
    x66
    May 22, 2019
    16
    最怕的难道不是写了一大串,突然线上出一个空指针,根本找不到是哪一行的问题,那感觉简直绝望。
    yuankui
    yuankui
    OP
    May 22, 2019
    17
    不要吐槽太长嘛,我就算是短成俩行,他遇到异常,还是得咯噔一下
    syhan
    syhan
    May 22, 2019
    18
    Try+1
    reeco
    reeco
    May 22, 2019
    19
    用 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
    yuankui
    OP
    May 22, 2019
    20
    @theTd 嗯嗯
    guyeu
    guyeu
    May 22, 2019
    21
    代码组织有问题,流并不是所有地方都适用的。
    art2cat
    art2cat
    May 22, 2019
    22
    effective java 里说不要超过三行,楼主这是入了魔啊
    yuankui
    yuankui
    OP
    May 22, 2019
    23
    @art2cat 我不如地狱,谁入地狱😆
    yuankui
    yuankui
    OP
    May 22, 2019
    24
    @passerbytiny 当然跟流有关系。

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

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

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

    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2866 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 10:52 · PVG 18:52 · LAX 02:52 · JFK 05:52
    ♥ Do have faith in what you're doing.