メソッド参照と再利用可能なオプションのマッピングを作成するには?

cmlonder:

私は、メソッドの参照とオプション機能を使用しようとしているが、それは実際にどのように再利用可能なコードでそれを最適化するために私を混同しました。私は、私は、Java-6スタイルを取り除くことを決めたと同時に、(私にとっては)これらすべての新機能を使用しようとしている間、私は、今私は、私はシンプルに考えることができないと思う私はそれがovercomplicatedされることを感じてこだわっていると思います。私はどのように作成することができます

List<BooleanExpression> expressionMapping = new ArrayList<>();

    if (request != null) { // request is input parameter, a DTO

        Optional.ofNullable(request.getPlantId())
            .map(campaign.plant.id::contains) // campaign is static created by Querydsl
            .ifPresent(expressionMapping::add);

        Optional.ofNullable(request.getTitle())
            .map(campaign.title::containsIgnoreCase)
            .ifPresent(expressionMapping::add);

        Optional.ofNullable(request.getCampaignNumber())
            .map(this::getLikeWrapped)
            .map(campaign.campaignNumber::like)
            .ifPresent(expressionMapping::add);
... 20 more Optional bunch of code like this
}

また、以前のもののようなオプションを使用してこのコードを書くと問題が発生しました:

if (request.getLockVehicle() != null) {
            if (request.getLockVehicle()) {
                expressionMapping.add(campaign.lockVehicle.isNotNull());
            } else {
                expressionMapping.add(campaign.lockVehicle.isNull());
            }
        }
oleg.cherednik:

どのような使用についてenumのすべてのフィールドを宣言するRequestと、コードの共通部分として使用することができます。私は、これは私のアプローチを表示するだけで、それをチェックしませんでした。

public enum RequestField {
    PLANT_ID(Request::getPlantId, (val, campaign) -> campaign.plant.id::contains),
    TITLE(Request::getTitle, (val, campaign) -> campaign.title::containsIgnoreCase),
    CAMPAIGN_NUMBER(Request::getCampaignNumber, (val, campaign) -> campaign.campaignNumber::like),
    // ... more fields here ...
    ;

    private final Function<Request, Optional<Object>> get;
    private final BiFunction<Object, Campaign, BooleanExpression> map;

    RequestField(Function<Request, Object> get, BiFunction<Object, Campaign, BooleanExpression> map) {
        this.get = get.andThen(Optional::ofNullable);
        this.map = map;
    }

    public static List<BooleanExpression> getBooleanExpressions(Request request, Campaign campaign) {
        if (request == null)
            return Collections.emptyList();

        List<BooleanExpression> res = new LinkedList<>();

        for (RequestField field : values())
            field.get.apply(request)
                     .map(r -> field.map.apply(r, campaign))
                     .ifPresent(res::add);

        return res.isEmpty() ? Collections.emptyList() : Collections.unmodifiableList(res);
    }
}

そして、あなたのクライアントコードは次のように見ていることになります。

List<BooleanExpression> booleanExpressions = RequestField.getBooleanExpressions(request, campaign);

PS あなたの最後のコードは次のようになり次のようになります。

if (request.getLockVehicle() != null)
    expressionMapping.add(request.getLockVehicle() ? campaign.lockVehicle.isNotNull() : campaign.lockVehicle.isNull());

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=190689&siteId=1