업데이트 스트림을 이용하여 두번째의 값에 기초하여 하나 개의리스트 내의 오브젝트

일하러가는 길 :

나는이 개 해당 목록이 :

public class BookOverallData {
    private Long idOfBook;
    private String title;
    private String authour;
    private BigDecimal basePrice;
    private Integer discountRate;
}

public class TimeDiscount {    
    private Long idOfBook;
    private Integer discountRate;    
}

Set<BookOverallData> booksToReturn
Set<TimeDiscount> actualPromotions

목표 수단은 추가 합 할인이다 discountRate에서 actualPromotionsdiscountRate으로부터의 값 booksToReturn리스트. 두 목록에서 개체가 일치 할 수있다 idOfBook.

나는 그것을 해결하는 방법입니다

booksToReturn.forEach(
            p -> {
                final Optional<TimeDiscount> promotion = actualPromotions.stream().filter(ap -> Objects.equals(ap.getIdOfBook(), p.getIdOfBook())).findFirst();
                promotion.ifPresent(ap -> p.setDiscountRate(ap.getDiscountRate() + p.getDiscountRate()));
            }
        );

난 그냥 스트림을 탐험 그리고 난 내 솔루션이 덩어리 진 생각합니다. 당신은 어떻게 스트림 및 기능적 접근의 사용과, 더 우아한 방식으로이 문제를 해결할 것인가?

우스만 D :

내가 처음부터 매핑 만드는 것 TimeDiscount::getIdOfBook까지를 TimeDiscount:

Map<Long, TimeDiscount> accumulator = 
      actualPromotions.stream()
                     .collect(toMap(TimeDiscount::getIdOfBook, Function.identity()));

그럼 내가 할 거라고 :

booksToReturn.forEach(e -> {
       TimeDiscount timeDiscount = accumulator.get(e.getIdOfBook());
       if (timeDiscount != null) e.setDiscountRate(e.getDiscountRate() + timeDiscount.getDiscountRate());
});

또는 당신의 사용과 유지하려면 Optional몇 가지 이유.

booksToReturn.forEach(e -> 
       Optional.ofNullable(accumulator.get(e.getIdOfBook()))
          .ifPresent(p -> e.setDiscountRate(e.getDiscountRate() + p.getDiscountRate()))
);

이것에 비효율적 룩업 개선 한 actualPromotions.stream()각 요소 booksToReturn.

추천

출처http://43.154.161.224:23101/article/api/json?id=173626&siteId=1