I have two methods which are nearly the same:
public String find(Query query) {
return PRODUCT.stream()
.filter(byName(query.getName()))
.filter(byCount(query.getNumber()))
.map(getValueOf(query.getName()))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException());
}
and second:
public String findSpecial(Query query) {
return SPECIAL_PRODUCTS.stream()
.filter(byName(query.getName()))
.filter(byCount(query.getNumber()))
.filter(byIsDoubled(query.isDoubled()))
.map(getValueOf(query.getName()))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException());
}
so the difference is only line .filter(byIsDoubled(query.isDoubled())).
Is there a good way to not duplicate methods body?
filter. It doesn't looks good for mefilter(!isSpecial || byIsDoubled(query.isDoubled()))which return true ifisSpecialis false and pass likefind(Query query, boolean isSpecial)though I agree with @YCF_L and sometimes clean code is better than making complex to remove duplicate lines.public String find(Query query, List<Product> list,List<Predicate<Product>> predicates){ return list.stream().filter(product -> predicates.stream() .allMatch(productPredicate -> productPredicate.test(product))) .map(getValueOf(query.getName())) .findFirst() .orElseThrow(IllformedLocaleException::new); }