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);}