我有两个几乎相同的方法:
public String find(Query query) {
return PRODUCT.stream()
.filter(byName(query.getName()))
.filter(byCount(query.getNumber()))
.map(getValueOf(query.getName()))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException());
}第二点:
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());
}因此,唯一的区别就是.filter(byIsDoubled(query.isDoubled()))行。
有没有不复制方法体的好方法?
发布于 2020-10-20 19:19:02
你可以这样做:
SPECIAL_PRODUCTS.stream().filter(findConditional(query)).map(getValueOf(query.getName()))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException());
public static Predicate<String> findConditional(Query query) {
List<Predicate<String>> l = new ArrayList<>();
Predicate<String> defaultPredicate = s -> true;
l.add(byName(query.getName()));
l.add(byCount(query.getNumber()));
if (query.isDoubled()) {
l.add(byIsDoubled(query.isDoubled()));
}
return l.stream().reduce(defaultPredicate, (predicate1, predicate2) -> predicate1.and(predicate2));
}https://stackoverflow.com/questions/64442045
复制相似问题