Rumah  >  Soal Jawab  >  teks badan

Java8Stream异常处理

我也是刚用上Java8的Stream,所有的一切都还在照猫画虎的阶段。

在异常处理这块不敢贸然前进,因为我看到某篇文的这样一段话

在单线程环境中,使用捕获受检异常并重新抛出非受检异常的方法是可行的。但是在多线程环境这样用,就存在一些风险。

多线程环境中,Lambda表达式中发生的错误会被自动传递到主线程中。这会带来两个问题:

这不会停止其他正在并行执行的Lambda表达式。
如果有多个线程抛出了异常,在主线程中却只能捕获到一个线程中的异常。如果这些异常信息都很重要的话,那么更好的方法是在Lambda表达式中就进行异常处理并将异常信息作为结果的一部分返回到主线程中。

我现在是用的Stream流的Map方法,当然用的是并发,想在map里的方法里只要有一个出错就让他停下来,不运行其他的。。这个需求该怎么搞。。

paths.stream()
    .map(path -> {
        try {
            return new File(path).getCanonicalPath();
        } catch(IOException ex) {
            throw new RuntimeException(ex);
        }
    })
    .forEach(System.out::println);

我用了这种方法确实停下来了,那还有什么好的方法,或者说是否有何问题,这样的话就拿不到具体哪个线程有问题了吧

PHPzPHPz2744 hari yang lalu734

membalas semua(2)saya akan balas

  • 高洛峰

    高洛峰2017-04-18 10:50:40

    Model pemikiran anda salah Penapis peta bukan gula sintaktik Java8 masih mempunyai keupayaan pengaturcaraan berfungsi.
    Inti ungkapan fungsian ialah invarian Ini bukan untuk memerlukan penghapusan pembolehubah, tetapi untuk mewujudkan pemikiran yang setara dan memikirkan masalah dari segi proses penilaian >

    Contoh anda, seperti meminta berhenti dalam peta, adalah di luar reka bentuk, kerana semantik peta menjamin bahawa ia akan merentasi semua data, dan jenis yang dikembalikan mesti konsisten dan mempunyai panjang yang sama. Ia juga sangat tidak elegan untuk membuang pengecualian rumtime secara terburu-buru.

    Terdapat beberapa penyelesaian,
    Gunakan pilihan atau sama ada (ini tidak disediakan secara rasmi, anda perlu mendapatkannya sendiri) untuk membungkus jenis pulangan anda untuk memastikan semantik peta (letak ralat dalam nilai pulangan, tetapi jenis kekal tidak berubah), maklumat khusus boleh didapati di Baidu)

    Jika data anda adalah kontekstual, gunakan lipatan (kurangkan) dan bukannya peta.

    Daripada menggunakan aliran, gunakan untuk pemrograman sebenarnya adalah pengaturcaraan dan pilih penyelesaian terbaik untuk masalah tersebut tidak sebaik pemberitahuan penyegerakan manual.

    Selain itu, keselarian aliran tidak sebaik yang anda fikirkan. Saya menyalahgunakan copyonwrite Selepas bermain dengannya untuk seketika, saya hampir tidak pernah menggunakannya lagi.
    Walau bagaimanapun, java8 mempunyai CompletableFuture yang mungkin memenuhi keperluan anda.

    balas
    0
  • PHPz

    PHPz2017-04-18 10:50:40

    CountDownLatch(1)

    Apabila menangkap pengecualian:

    CountDownLatch.countDown();

    Akhir sekali:

    CountDownLatch.await();
    xxx.stop();
    

    Saya belum pernah menggunakan Java8's Stream. . .

    balas
    0
  • Batalbalas