Y at-il une classe de bibliothèque standard de java8 qui signifie « peut-être à l'exception » de la même manière que des moyens java.util.Optional « peut-être nulle »?

Jacey Squires:

J'ai des classes dites par exemple CalculationOutcomeet FileHashOutcome. Leurs constructeurs ont des (ActualResult, Throwable)arguments, et à la fin d'une chaîne de CompletionStages je handle(XxxOutcome::new).

Il pourrait faire des intentions plus claires et économiser boilerplate si je pouvais écrire dire PossiblyWithError<FileHash>.

Edit: Les gens demandent par exemple le code ...

class FileHashOutcome {
  private final String hash;
  private final Throwable throwable;
  FileHashOutcome(String hash, Throwable throwable){
    // Usual assignments
  }
}

CompletionStage<FileHashOutcome> future =
   SomeExternalLibrary.calculateHash(file) 
   // ...It's a CompletionStage<String> at this stage...
   .handle(FileHashOutcome::new);

// Then I pass `future` to a service that 
// will execute it and pass back the result asynchronously

Pour être précis, il est dans un acteur Akka, et je demande à l'infrastructure de conduite le dos de résultat dans l'acteur comme un message.

Edit: suggestions qui CompletableFuturepourraient faire le travail ... Oui, bon point, il représente exactement ce qui doit être représenté. Et il est un peu une odeur de code pour mettre en œuvre votre propre avenir prêt et rugueux , puis l' envelopper dans l'avenir de java8.

Il y a quelques cerceaux pour sauter à travers selon que vous avez accès à la « enveloppe » de l'avenir. Si vous êtes à l' intérieur d' un thenApplyalors vous êtes « dans » l'enveloppe et vous ne savez pas. Et l'infrastructure Akka « jette » l'enveloppe et ne renvoie le résultat (et il ne retourne rien s'il y avait une exception, qui est l' une des principales raisons pour lesquelles je voulais attraper et envelopper cette exception à la fin de la CompletionStagechaîne). Bien sûr, depuis que je créé le CompletionStage, je pouvais le retenir dans une variable membre jusqu'à ce que l'infrastructure me poussa du coude qu'il avait terminé.

Steve:

Par @marstran, le nom usuel de cette classe est Try .

Scala a une telle classe dans sa bibliothèque standard: https://www.scala-lang.org/api/2.9.3/scala/util/Try.html

La même chose peut être fait en Java, mais il ne fait pas partie de la bibliothèque standard: https://dzone.com/articles/why-try-better-exception-handling-in-java-with-try

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=99039&siteId=1
conseillé
Classement