Java 8 重构Java8流代码-代码复制
我有两种几乎相同的方法:Java 8 重构Java8流代码-代码复制,java-8,stream,refactoring,Java 8,Stream,Refactoring,我有两种几乎相同的方法: public String find(Query query) { return PRODUCT.stream() .filter(byName(query.getName())) .filter(byCount(query.getNumber())) .map(getValueOf(query.getName())) .fin
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));
}
SPECIAL_PRODUCTS.stream().filter(findConditional(query)).map(getValueOf(query.getName()))
.findFirst()
.orelsetrow(()->new IllegalArgumentException());
公共静态谓词findConditional(查询){
列表l=新的ArrayList();
谓词defaultPredicate=s->true;
l、 添加(byName(query.getName());
l、 add(byCount(query.getNumber());
if(query.isDoubled()){
l、 add(byIsDoubled(query.isDoubled());
}
返回l.stream().reduce(defaultPredicate,(predicate1,predicate2)->predicate1.and(predicate2));
}
有时复制一些行并不坏。@YCF\u L但我复制了5行,只添加了过滤器
。这对我来说不太好。你可以设计一些类似于过滤器(!isSpecial | | byIsDoubled(query.isDoubled())
的东西,如果isSpecial
为false,则返回true,并像find(query-query,boolean-isSpecial)一样传递
虽然我同意@YCF_L,有时干净的代码比复杂化以删除重复的行要好。这样做:公共字符串查找(查询、列表、列表谓词){return List.stream().filter(product->predicates.stream().allMatch(productPredicate->productPredicate.test(product))).map(getValueOf(query.getName())).findFirst().OrelsThrow(IllformedLocaleException::new);}