在Java 8中替换以下代码的优雅方法是什么?

时间:2018-11-15 17:20:18

标签: lambda java-8

我的Java程序中有以下代码(由实际程序改写而成):

import java.util.Objects;
import java.util.function.BiPredicate;

class Class1 {
    String propertyA;
    boolean propertyANot;
    String propertyB; //Not all members have corresponding negate indicator
    String propertyC;
    String propertyD;
    boolean propertyDNot;
    ....
}


class Class2 {
    String propertyX;
    String propertyY;
    String propertyZ;
    String propertyW;
    ....
}

public class Main {

    //Fail early without inspecting all properties 
    private BiPredicate<Class1,Class2> matchObjects = (obj1,obj2) -> {

        if(obj1.propertyA != null && obj2.propertyX != null) {
            //property1Not is a boolean indicates negation
            if(obj1.propertyANot && !Objects.equals(obj1.propertyA,obj2.propertyX)) {
                return false;
            }
            else if(!obj1.propertyANot && Objects.equals(obj1.propertyA,obj2.propertyX)) {
                return false;
            }
        }

        if(obj1.propertyB != null && obj2.propertyY != null) {
            if(!Objects.equals(obj1.propertyB,obj2.propertyY)) {
                return false;
            }
        }
        .... 

        return true;
    };
}

如注释中所示,我希望matchObjects方法在匹配条件之一失败时就失败。同样,输入对象也没有一对一的对应关系来概括循环中的代码。

我有以下问题:

  

使用函数式编程重写此代码的最佳方法是什么   java8的概念?

如果条件使我觉得这里有太多需要改进的空间,那就太多了。

我还编写了一个自定义谓词,该谓词采用多个&Optional参数来概括在if条件下对属性等效性的测试。

但是,这并不能帮助我摆脱多个if条件。

请提前帮助和感谢。

1 个答案:

答案 0 :(得分:3)

您可以尝试以下操作:

position