首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构Java 8流代码-代码复制

重构Java 8流代码-代码复制
EN

Stack Overflow用户
提问于 2020-10-20 17:11:01
回答 1查看 95关注 0票数 0

我有两个几乎相同的方法:

代码语言:javascript
复制
public String find(Query query) {
        return PRODUCT.stream()
                .filter(byName(query.getName()))
                .filter(byCount(query.getNumber()))
                .map(getValueOf(query.getName()))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException());
    }

第二点:

代码语言:javascript
复制
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()))行。

有没有不复制方法体的好方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-20 19:19:02

你可以这样做:

代码语言:javascript
复制
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));
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64442045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档