java 8 Streams를 사용하여 목록이 비어 있으면 기본 목록을 반환합니까?


9

권장 제품이 비어 있는지 명시 적으로 확인 하는 대신 아래의 하나의 스트림 작업 집합으로 아래를 수행 할 수있는 방법이 있습니까? 그렇지 않으면 기본 목록을 반환하고 그렇지 않으면 필터링 된 목록을 반환 합니까?

public List<Product> getRecommendedProducts() {
    List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.toList());

    if (recommendedProducts.isEmpty()) {
        return DEFAULT_PRODUCTS;
    }

    return recommededProducts;
}

4
기존 코드에 어떤 문제가 있습니까?
Andy Turner

@AndyTurner 동의합니다. 코드는 그대로 좋습니다. 내가 할 유일한 개선 사항 은 if-else 문 대신 삼항 연산자를 사용하는 입니다. 그래도 여전히 맛의 문제입니다.
ETO

@ETO 아무 문제가 없지만 명시 적 조건 검사없이 Stream API를 사용하여 수행 할 수있는 방법이 있는지 알아 내려고 노력하고있었습니다. 답장을 보내 주셔서 감사합니다. 삼항 연산자 제안이 마음에 듭니다.
user3495691

답변:


5

당신은 이것을 시도 할 수 있습니다 :

List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.collectingAndThen(Collectors.toList(), list -> list.isEmpty() ? DEFAULT_PRODUCTS : list));

5

를 사용하여 목표를 달성 할 수 Optional는 있지만 여전히 기존의 삼항 연산자를 선택합니다.

이 특별한 경우에는 훨씬 더 의미가 있고 가독성을 향상시킵니다.

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;

4

그렇습니다 Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.