如何解决重构Java 8流代码-代码重复
我有两种几乎相同的方法:
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()))
。
有没有不重复方法主体的好方法?
解决方法
您可以执行以下操作:
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));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。