반응형
public List<String> findPrices(String product) {
List<CompletableFuture<String>> priceFutures =
shops.stream()
.map(shop -> CompletableFuture.supplyAsync(() -> shop.getPrice(product), executor))
.map(future -> future.thenApply(Quote::parse))
.map(future -> future.thenCompose(quote -> CompletableFuture.supplyAsync(() -> Discount.applyDiscount(quote), executor)));
return priceFutures.stream()
.map(CompletableFuture::join)
.coolect(toList());
}
위의 코드에서는 첫 번째 CompletableFuture에 thenCompose 메서드를 실행한 다음에 실행 결과를 첫 번째 실행 결과를 입력으로 받는 두 번째 CompletableFuture로 전달했다.
만약에 독립적으로 실행된 두 개의 CompletableFuture 결과를 합쳐야 하는 상황이라면 어떻게 해야할까?
첫 번째 CompletableFuture의 동작 완료와 관계없이 두 번째 CompletableFuture를 실행하는 경우이다.
이 경우 thenCombine
메서드를 사용할 수 있다. thenCombine 메서드는 BiFunction을 두 번째 인수로 받는데, 두 개의 CompletableFuture 결과를 어떻게 합칠지 정의하면 된다.
상황)
온라인 상점에서는 유로(EUR) 가격 정보를 제공.
고객에게는 항상 달러(USD)가격을 보여줘야함.
How?
→ 상점에서 상품 가격 요청 (비동기)
→ 현재 환율 요청(비동기)
비동기로 동시에 요청하며 두 가지 데이터를 얻었으면 가격 x 환율을 곱하여 결과를 합친다. 서로 독립적이기 때문에 동시에 두 요청을 할 수 있다.
CompletableFuture<Double> futurePriceInUSD =
CompletableFuture.supplyAsync(() -> shop.getPrice(product))
.thenCombine(
CompletableFuture.supplyAsync(
() -> ExchangeService.getRate(Money.EUR, Money.USD)),
(price, rate) -> price * rate
)
출처 : 모더 자바 인 액션
반응형
'프로그래밍 노트 > JAVA' 카테고리의 다른 글
[JAVA]Stream 리듀싱 활용 (0) | 2021.09.20 |
---|---|
[JAVA]Stream 검색과 매칭 (0) | 2021.09.20 |
[JAVA]비동기 작업 파이프라인 만들기(CompletableFutrue 파이프라인) (0) | 2021.09.20 |
[JAVA]병렬 스트림(parallel) vs CompletableFuture non-blocking 코드 만들기 (0) | 2021.09.07 |
[JAVA]CompletableFutrue를 사용해보자 (0) | 2021.09.05 |