Nano Hash - криптовалюты, майнинг, программирование

Сгладить фьючерсы на Java

У меня есть две функции, каждая из которых возвращает CompletebleFuture<Boolean> экземпляров, и я хочу or их объединить в одно упорядоченное и короткозамкнутое будущее.

public CompletableFuture<Boolean> doA();
public CompletableFuture<Boolean> doB();

Не будущий код (т.е. возвращающий только логические значения) будет просто

return doA() || doB();

Используя фьючерсы, я достиг этой точки, когда возвращаемый тип является экземпляром CompletableFuture<CompletableFuture<Boolean>>.

doA.thenApply(b -> {
  if (!b) {
    return doB();
  } else {
    return CompletableFuture.completedFuture(b);
  }
}

Есть ли способ сгладить это? Или каким-либо образом я могу сделать возвращаемый тип CompletablyFuture<Boolean>?

Изменить: обратите внимание, что возможность короткого замыкания фьючерсов - это функция, которую я хочу. Я знаю, что тогда я выполняю вычисления последовательно, но это нормально. Я не запускаю doB, когда doA возвращает true.

25.04.2014

  • docs.oracle.com/javase/8/docs/api/java/util/concurrent/ Это работает? 26.04.2014
  • Нет. Я не хочу выполнять второе вычисление, если первое возвращает true. Использование thenAcceptBoth выполнит оба, а также возврат CompletableFuture<Void> означает, что я потерял результат 26.04.2014
  • Означает ли это, что doA и doB могут выполняться в одном потоке? 26.04.2014
  • В моем конкретном случае оба вызова будут создавать фьючерсы, поддерживаемые одним и тем же исполнителем, поэтому вполне возможно, что они будут выполняться в одном потоке. Однако это будут два отдельных выполнения без связи между процессами, поэтому я не вижу никакой связи с потоками, в которых каждый из них выполняется. 27.04.2014

Ответы:


1

Просто используйте метод thenCompose вместо thenApply:

CompletableFuture<Boolean> result = doA().thenCompose(b -> b
    ? CompletableFuture.completedFuture(Boolean.TRUE) : doB());
25.04.2014
  • возможно, используйте applyToEither, чтобы использовать результат doA в doB 29.04.2014

  • 2

    Если создание вложенного будущего находится вне вашего контроля, вы можете сгладить его следующим образом:

    static <T> CompletableFuture<T> flatten(
      CompletableFuture<CompletableFuture<T>> nestedFuture) {
        return nestedFuture.thenCompose(Function.identity());
    }
    
    21.03.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..