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

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

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

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

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

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

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

    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2223 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 03:19 · PVG 11:19 · LAX 20:19 · JFK 23:19
    ♥ Do have faith in what you're doing.