Refactoring for DRY (original) (raw)
Sam Pullara spullara at gmail.com
Mon Apr 8 19:30:50 PDT 2013
- Previous message: Refactoring for DRY
- Next message: Refactoring for DRY
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
So as a first pass, I would do normal refactoring to use the API more effectively:
Predicate<Person> ageRange = p -> p.getAge() >= 12 && p.getAge() < 65;
people.parallelStream()
.filter(ageRange)
.forEach(p -> {
p.setPrice(9.25);
});
people.parallelStream()
.filter(ageRange.and(Person::hasCoupon))
.forEach(p -> {
p.setPrice(p.getPrice() - 2.00);
});
people.parallelStream()
.filter(ageRange.negate())
.forEach(p -> {
p.setPrice(5.25);
});
people.stream()
.forEach(p -> {
p.display();
});
double sum = people.stream().map(p -> p.getPrice()).collect(Collectors.toDoubleSummaryStatistics(d -> d)).getSum();
But aggressively I might optimize by only doing a single pass:
double sum = people.parallelStream().flatMap( (Person p, Consumer<Person> c) -> {
if (p.getAge() >= 12 && p.getAge() < 65) {
if (p.hasCoupon()) {
p.setPrice(9.25);
} else {
p.setPrice(7.25);
}
} else {
p.setPrice(5.25);
}
p.display();
c.accept(p);
}).map(Person::getPrice)
.collect(Collectors.toDoubleSummaryStatistics(d -> d)).getSum();
But that doesn't really address the larger issue of the multiple passes. I think this would be most effectively done with tee() On Apr 8, 2013, at 4:35 PM, "Barry Burd" <bburd at drew.edu> wrote:
The following code seems very repetitious to me. Ss there a recommended way to refactor this code?
people.parallelStream() .filter(p -> p.getAge() >= 12) .filter(p -> p.getAge() < 65)_ _.forEach(p -> { p.setPrice(9.25); }); people.parallelStream() .filter(p -> p.getAge() >= 12) .filter(p -> p.getAge() < 65)_ _.filter(p -> p.hasCoupon()) .forEach(p -> { p.setPrice(p.getPrice() - 2.00); }); people.parallelStream() .filter(p -> (p.getAge() < 12 || p.getAge() >= 65)) .forEach(p -> { p.setPrice(5.25); }); people.stream() .forEach(p -> { p.display(); }); people.stream().map(p -> p.getPrice()).forEach(amount -> total += amount);
- Previous message: Refactoring for DRY
- Next message: Refactoring for DRY
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]