В Java, как я могу объявить переменную в условии, если лямбда? - PullRequest
4 голосов
/ 08 мая 2019

В моем коде у меня есть метод предиката, который возвращает i, если выполняются определенные условия, и мне нужно объявить переменную внутри него, но метод написан в лямбда-выражении, и я не знаю, как это сделать этот. Вот мой код:

public static Predicate<MFDWHDealExt> isAccepted() {
        MyCalendar startDate = new MyCalendar();

        return (i -> 
                i.getCompany().equals("ACCEPTED")
                && i.getDealType() == MFDealTypeEnum.AcceptedDeal              
                && i.getSettlementDate().beforeOrEqual(startDate.findDay(i.getDealDate(), 2, true))
                );
    }

мне нужно объявить startDate (пользовательская дата MyDate) со значением i.getSettlementDate, в противном случае метод findDay (который возвращает рабочие дни), потому что сейчас это null.

Ответы [ 4 ]

5 голосов
/ 08 мая 2019

Здесь:

    return (i -> { 
            return i.getCompany().equals("ACCEPTED")
              && i.getDealType() == MFDealTypeEnum.AcceptedDeal              
              && i.getSettlementDate().beforeOrEqual(startDate.findDay(i.getDealDate(), 2, true))
            });

Когда не с использованием синтаксиса лямбд в одну строку , например x-> 2*x, вам нужны фигурные скобки. И вы не можете использовать этот однострочный синтаксис, когда намереваетесь объявить локальную переменную.

См. здесь для официальной документации!

Другими словами: если вы хотите написать несколько операторов, например, определить локальную переменную, вам нужны эти фигурные скобки!

Наконец: будьте осторожны с тем, что вы делаете здесь. (imho) Лямбда-выражения должны быть очень короткими и лаконичными. Когда они становятся «более сложными» (например, им нужны локальные переменные), тогда я предлагаю не использовать лямбду, а объявлять реальный метод и вызывать его.

4 голосов
/ 08 мая 2019

Просто используйте блок кода в лямбде и объявите вашу переменную внутри.

public static Predicate<MFDWHDealExt> isAccepted() {
    MyCalendar startDate = new MyCalendar();

    return (i -> {
            MyDate startDate = i.getSettlementDate();
            boolean result = i.getCompany().equals("ACCEPTED")
            && i.getDealType() == MFDealTypeEnum.AcceptedDeal              
            && startDate.beforeOrEqual(startDate.findDay(i.getDealDate(), 2, true));
            return result;
            });
}
3 голосов
/ 08 мая 2019

Лямбда-выражение - это сокращение для анонимного класса, реализующего интерфейс с одним методом.

Вы можете определить любое мышление внутри этого уникального метода.

Лямбда-выражение:

 (a, b) -> {
    // Your code here      
 }

эквивалентно:

 new MyInterface() {
    public ReturnType uniqueMethod(AType a, BType b) {
        // Exactly the same code here
    }
 }

Зависит от вида анонимного класса, полученного из интерфейса, который вам нужен для записи ReturnType, также может быть void, а количество параметров может быть 0 или любым количеством параметров (в этом случае два параметра тип AType и BType)

Следующая форма лямбда-выражения:

(a, b) -> something

является еще одним ярлыком и эквивалентен:

   new MyInterface() {
       public ReturnType uniqueMethod(AType a, BType b) {
           // Same as before but with the additional keyword return
           return something;
       }
    }

В вашем случае вы должны применить первую форму лямбда-выражения с блоком { }, и вы можете определить любой тип и количество переменных в скобках

1 голос
/ 08 мая 2019

Вам нужно развернуть его до блока кода;

    return (i -> { 
            int myVar;
            return i.getCompany().equals("ACCEPTED")
               && i.getDealType() == MFDealTypeEnum.AcceptedDeal              
               && i.getSettlementDate().beforeOrEqual(startDate.findDay(i.getDealDate(), 2, true));
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...