Какой элегантный способ заменить следующий код в 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 завершился ошибкой, как только одно из условий сопоставления не сработает. Также входные объекты не имеют однозначного соответствия для обобщения кода в цикле.

У меня следующий вопрос:

What's the best way to rewrite this code using functional programming concepts of java8?

Слишком много, если условия заставляют меня думать, что здесь есть возможности для улучшения.

Я также написал специальный предикат, который принимает несколько параметров & Optional для обобщения проверки эквивалентности свойств в условиях if.

Однако это не помогает мне избавиться от множества состояний if.

Пожалуйста, помогите и заранее спасибо.

Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
1
0
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать что-то вроде этого:

@FunctionalInterface interface TriPredicate<A, B, C> {
  boolean test (A a, B b, C c);
}

private BiPredicate<Class1, Class2> matchObjects = (obj1, obj2) -> {
  TriPredicate<String, String, Boolean> matchProp = (propA, propX, cond) ->
        propA == null && propX == null ||
        (cond == null || cond) == Objects.equals(propA, propX);
  return matchProp.test(obj1.propertyA, obj2.propertyX, obj1.propertyANot) &&
        matchProp.test(obj1.propertyB, obj2.propertyY, null) &&
        matchProp.test(obj1.propertyC, obj2.propertyZ, null) &&
        matchProp.test(obj1.propertyD, obj2.propertyW, obj1.propertyDNot);
};

+1. Проблема в том, что у меня есть двухзначные свойства в обоих моих классах, и в этом случае оператор return становится слишком большим. Я ищу цепочки лямбда-функций.

bp4D 15.11.2018 19:47

Что значит слишком большой? Не компилируется?

Donat 15.11.2018 19:54

@ Федерико Перальта Шаффнер: да, я думаю, это возможно. Хорошая точка зрения.

Donat 15.11.2018 21:16

@ Федерико Перальта Шаффнер: Да, я проверял. Это возможно.

Donat 15.11.2018 22:02

Другие вопросы по теме