Существует ли класс стандартной библиотеки java8, который означает «возможно, с исключением» так же, как java.util.Optional означает «возможно, ноль»?

У меня есть классы, которые называются скажем CalculationOutcome и FileHashOutcome. У их конструкторов есть (ActualResult, Throwable) аргументы, а в конце цепочки CompletionStage у меня есть handle(XxxOutcome::new).

Если бы я мог написать, скажем, PossiblyWithError<FileHash>, это могло бы сделать намерения более ясными и сэкономить некоторые шаблоны.

Обновлено: люди просят пример кода...

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

Если быть точным, это внутри актора Akka, и я прошу инфраструктуру трубка вернуть результат обратно в актор в виде сообщения.

Редактировать: предложения о том, что CompletableFuture может выполнять эту работу... Да, хороший момент, он представляет именно то, что должно быть представлено. И это немного похоже на запах кода, чтобы реализовать свое собственное грубое и готовое будущее, а затем обернуть его в будущее java8.

Есть несколько обручей, через которые нужно прыгать в зависимости от того, есть ли у вас доступ к «конверту» будущего. Если вы внутри thenApply, то вы «внутри» конверта и не знаете об этом. И инфраструктура Akka «выбрасывает» конверт и возвращает только результат (и ничего не возвращает, если было исключение, что является одной из основных причин, почему я хотел поймать и обернуть это исключение в конце цепочки CompletionStage) . Конечно, поскольку я создал CompletionStage, я мог хранить его в переменной-члене, пока инфраструктура не подтолкнет меня к завершению.

Его нет в стандартной библиотеке, но обычное имя этого класса — Try.

marstran 07.04.2019 17:42

Не совсем понятно, что вы хотите. Покажите какой-нибудь код, пожалуйста.

RealSkeptic 07.04.2019 17:45

Я не знаю, о чем вы спрашиваете. Вы хотите передать эту вещь в качестве аргумента вместо Throwable? Если это так, просто используйте два конструктора, один из которых не принимает бросок.

Michael 07.04.2019 18:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
3
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно @marstran, обычное имя этого класса — Пытаться.

В стандартной библиотеке Scala есть такой класс: https://www.scala-lang.org/api/2.9.3/scala/util/Try.html.

То же самое можно сделать и в Java, но это не часть стандартной библиотеки: https://dzone.com/articles/why-try-better-exception-handling-in-java-with-try

Это очень похоже на CompletableFuture. Или я что-то упускаю?

VGR 07.04.2019 19:28

Нет, это не так, @VGR, CompletableFuture делает все это, и даже лучше.

Olivier Grégoire 07.04.2019 20:29

Эй, @VGR, заслуживает ли то, что ты говоришь, другого ответа на этот вопрос? - я думаю, может даже закончиться выбранным ответом.

CryptoFool 08.04.2019 05:10

Другие вопросы по теме