Size: a a a

2021 March 05

n

nikitas🎅 in pro.jvm
на шарпах
источник

n

nikitas🎅 in pro.jvm
понимаю, что чат не тот
источник

IZ

Ivan Zemlyankiy in pro.jvm
наверное вот так будет ещё ближе к тому что я хотел
CompletableFuture<Integer> mustReturn42() {
 CompletableFuture<Integer> fastRequest =
     CompletableFuture.supplyAsync(() -> new Random().nextBoolean() ? 42 : 1);
 CompletableFuture<Integer> slowRequest =
     CompletableFuture.supplyAsync(
         () -> {
           try {
             Thread.sleep(1000);
           } catch (InterruptedException e) {
             throw new RuntimeException(e);
           }
           return 41;
         });

   return fastRequest.thenApply(
       result -> {
         if (result == 42) {
           return 42;
         } else {
           try {
             return slowRequest.get() + result;
           } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
           }
         }
       });
}
источник

E

Evgeniy ♎️ in pro.jvm
Ivan Zemlyankiy
нет, быстрый - он относительно быстрый )
ощущуение что пхоже как аналог Optional.orElse...когда по else высчитывается всегда, но если опшионал есть, то возьми его)
источник

IZ

Ivan Zemlyankiy in pro.jvm
Evgeniy ♎️
ощущуение что пхоже как аналог Optional.orElse...когда по else высчитывается всегда, но если опшионал есть, то возьми его)
да, именно так, но применительно к CF )
источник

E

Evgeniy ♎️ in pro.jvm
Ivan Zemlyankiy
да, именно так, но применительно к CF )
я бы поигрался методами
thenCompose()
.handle
и на крайняк Join
источник

IZ

Ivan Zemlyankiy in pro.jvm
Evgeniy ♎️
я бы поигрался методами
thenCompose()
.handle
и на крайняк Join
да это всё не то
источник

E

Evgeniy ♎️ in pro.jvm
(
источник

IZ

Ivan Zemlyankiy in pro.jvm
Evgeniy ♎️
я бы поигрался методами
thenCompose()
.handle
и на крайняк Join
handle - это же вообще для исключения
источник

IZ

Ivan Zemlyankiy in pro.jvm
блеаааааа походу вот так нужно:
CompletableFuture<Integer> fastResult = new CompletableFuture<>();
   CompletableFuture<Void> fastRequest =
       CompletableFuture.runAsync(
           () -> {
             if (new Random().nextBoolean()) {
               fastResult.complete(42);
             } else {
               fastResult.complete(1);
             }
           });
   CompletableFuture<Integer> slowRequest =
       CompletableFuture.supplyAsync(
           () -> {
             try {
               Thread.sleep(1000);
             } catch (InterruptedException e) {
               throw new RuntimeException(e);
             }
             return 41;
           });

   return fastRequest.thenCompose(
       ignore -> {
         try {
           if (fastResult.get() == 42) {
             return CompletableFuture.completedFuture(42);
           } else {
             return slowRequest.thenCombine(fastResult, (l, r) -> l + r);
           }
         } catch (InterruptedException | ExecutionException e) {
           throw new RuntimeException(e);
         }
       });
источник

IZ

Ivan Zemlyankiy in pro.jvm
а потом они ещё спрашиваю, а что нам Котлин даст?
источник

E

Evgeniy ♎️ in pro.jvm
Ivan Zemlyankiy
handle - это же вообще для исключения
неее...там же в него передаётся результат(если есть) и исключение(если есть)
источник

IZ

Ivan Zemlyankiy in pro.jvm
Evgeniy ♎️
неее...там же в него передаётся результат(если есть) и исключение(если есть)
ну как и в любой другой метод который then*
источник

IZ

Ivan Zemlyankiy in pro.jvm
ну по модулю исключения
источник

E

Evgeniy ♎️ in pro.jvm
Ivan Zemlyankiy
а потом они ещё спрашиваю, а что нам Котлин даст?
источник

IZ

Ivan Zemlyankiy in pro.jvm
не, к сожалению, это такой же anyOf, только тут  с типами по-проще
источник

IZ

Ivan Zemlyankiy in pro.jvm
anyOf возвращает <Object>
источник

IZ

Ivan Zemlyankiy in pro.jvm
тут возник вопрос:
  CompletableFuture<Integer> mustReturn42() {
   CompletableFuture<Integer> fastRequest = CompletableFuture.supplyAsync(
       () -> {
         if (new Random().nextBoolean()) {
           return 42;
         } else {
           return 1;
         }
       });
   CompletableFuture<Integer> slowRequest =
       CompletableFuture.supplyAsync(
           () -> {
             try {
               Thread.sleep(1000);
             } catch (InterruptedException e) {
               throw new RuntimeException(e);
             }
             return 41;
           });

   return fastRequest.thenCompose(
       fastResult -> {
         if (fastResult == 42) {
           return CompletableFuture.completedFuture(42);
         } else {
 // this is a data race, right?  
           return slowRequest.thenApply(slowResult -> slowResult + fastResult);
         }
       });
 }

есть ли тут гонка по данным?
в смысле fastResult - это же просто данные, а мы их в thenApply прихаем, который потенциально вообще на другом threadPool исполняется
источник

IZ

Ivan Zemlyankiy in pro.jvm
во, это эквивалент вот такой записи:
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 42);
int my = 123;
future.thenApply(it -> it + my);
источник

IZ

Ivan Zemlyankiy in pro.jvm
вроде тут есть гонка же, да?
источник