일하러가는 길 :
나는이 개 해당 목록이 :
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
에서 actualPromotions
행 discountRate
으로부터의 값 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
.