首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java 8压缩太多的if子句

使用Java 8压缩太多的if子句
EN

Stack Overflow用户
提问于 2021-03-17 12:30:24
回答 1查看 81关注 0票数 1

我用Java编写了以下代码块:

代码语言:javascript
复制
public mainFunction() {

...

if (!functionA(data1, data2)) {
  return new Left<>(Reason.INVALID_RULE);
}

if (!functionB(data1, data2)) {
  return new Left<>(FAILURE.INVALID_ID);
}

 ...there are a few if clauses like above...
}


private boolean functionA(Data1 data1, Data2 data2) {
    if(StringUtils.isNotBlank(data1.getAttr1)) {
       data2.setAttr1(data1.getAttr1);
       return true;
    }
    return false;
}

private boolean functionA(Data1 data1, Data2 data2) {
    try{
       data2.setAttr1(Attr2Enum.fromValue(data1.getAttr1));
       return true;
    } catch (Exception e) {
    return false;
    }
}

现在,我的问题是,我可以使用Java8压缩它们吗?

EN

回答 1

Stack Overflow用户

发布于 2021-05-31 19:28:26

有多种方法可以做到这一点。我试图创建一个可以执行这种验证链的Validator接口。虽然这不是一个完美的解决方案,但它可能会给你一个开始的想法。这是一个非常通用的解决方案(可以使用更通用的?超级和?扩展-您可以自己尝试)

代码:

代码语言:javascript
复制
package pecs;

import javafx.util.Pair;

public class Chaining {

    public static void main(String[] args) {
        Validation<Integer, String, Message> validation = (a, b, c) -> {
            return new Pair(a > 30, new Message("a should not be greater than 30"));
        };
        Validation<Integer, String, Message> validation2 = (a, b, c) -> {
            return new Pair(a > 20, new Message("a should not be greater than 20"));
        };
        Validation<Integer, String, Message> validation3 = (a, b, c) -> {
            return new Pair(a > 10, new Message("a should not be greater than 10"));
        };
        Validation<Integer, String, Message> validation4 = (a, b, c) -> {
            return new Pair(a > 5, new Message("a should not be greater than 5"));
        };

        //One way to call
        Validation<Integer, String, Message> validator = validation
                .and(validation2)
                .and(validation3)
                .and(validation4);

        System.out.println(validator.validate(4, "A00", 0));
        System.out.println(validator.validate(9, "A00", 0));
        System.out.println(validator.validate(11, "A00", 0));
        System.out.println(validator.validate(21, "A00", 0));
        System.out.println(validator.validate(31, "A00", 0));

        //Another way to call
        Pair<Boolean, Message> pair = validation
                .and(validation2)
                .and(validation3)
                .and(validation4)
                .validate(4, "String", 0);
        if(pair.getKey() == false) {
            System.out.println("All Validation successful");
        } else {
            System.out.println(pair);
        }

    }
}

代码中使用的验证器接口:

代码语言:javascript
复制
package pecs;

import javafx.util.Pair;
import java.util.Objects;

@FunctionalInterface
public interface Validation<A, B, C> {
    Pair<Boolean, C> validate(A a, B b, int count);

    default Validation<A, B, C> and(Validation<A, B, C> other) {
        Objects.requireNonNull(other);
        return (a, b, c) -> {
//            System.out.println("c=" + c);
            Pair<Boolean, C> validate = validate(a, b, c+1);
            if (validate.getKey() == true) {
                return validate;
            } else {
                //Termination condition.
                if(c == 0) {
                    Pair<Boolean, C> pair = other.validate(a, b, c);
                    if(pair.getKey() == false) {
                        return new Pair<>(false, null);
                    } else {
                        return pair;
                    }
                } else {
                    return other.validate(a, b, c);
                }
            }
        };
    }
}

请看一看,如果有任何改进建议。还有许多其他方法可以进行验证。例如,检查这个链接:https://dzone.com/articles/server-side-validator-using-functional-interfaces

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66667017

复制
相关文章

相似问题

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