Maison  >  Questions et réponses  >  le corps du texte

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 Il y a quelques jours727

répondre à tous(2)je répondrai

  • 高洛峰

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

    Votre modèle de pensée est erroné. Le filtre cartographique n'est pas du sucre syntaxique. Java8 a toujours des capacités de programmation fonctionnelles.
    Le cœur de l'expression fonctionnelle est l'invariance. Il ne s'agit pas d'exiger l'élimination de variables, mais d'établir une réflexion équivalente et de réfléchir au problème en termes de processus d'évaluation >

    Votre exemple, comme demander de s'arrêter dans la carte, est en dehors de la conception, car la sémantique de la carte garantit qu'elle traversera toutes les données, et le type renvoyé doit être cohérent et avoir la même longueur. Il est également très inélégant de lancer une exception imprudente.

    Il existe plusieurs solutions,
    Utilisez optionnellement ou l'une ou l'autre (cela n'est pas officiellement fourni, vous devez en obtenir une vous-même) pour envelopper votre type de retour afin de garantir la sémantique de la carte (mettez l'erreur dans la valeur de retour, mais le type reste inchangé), des informations spécifiques peuvent être trouvées sur Baidu)

    Si vos données sont contextuelles, utilisez plier (réduire) au lieu de map.

    Au lieu d'utiliser stream, utilisez for break. La programmation est en fait de la programmation. La clé est de résoudre le problème et de choisir la meilleure solution pour le problème. Parfois, la solution Steam n'est pas aussi bonne que la solution traditionnelle pour fork/join. n'est pas aussi bon que la notification de synchronisation manuelle.

    De plus, le parallélisme du stream n'est pas aussi bon qu'on le pense. J'abuse de copyonwrite Après avoir joué avec pendant un moment, je ne l'utilise presque plus.
    Cependant, java8 a un avenir complet qui peut répondre à vos besoins.

    répondre
    0
  • PHPz

    PHPz2017-04-18 10:50:40

    CountDownLatch(1)

    Lors de la détection d'une exception :

    CountDownLatch.countDown();

    Enfin :

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

    Je n'ai pas utilisé le Stream de Java8. . .

    répondre
    0
  • Annulerrépondre