在Java中,如何在if lambda条件内声明变量?

时间:2019-05-08 07:09:02

标签: java lambda java-8

在我的代码中,我有一个谓词方法,如果满足某些条件,它将返回i,我需要在其中声明一个变量,但是该方法是用lambda编写的,我不知道如何去做这个。 这是我的代码:

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 个答案:

答案 0 :(得分:5)

这里:

ord1-hlf-ord.orderers.svc.cluster.local

如果使用lambda的一行语法(例如 return (i -> { return i.getCompany().equals("ACCEPTED") && i.getDealType() == MFDealTypeEnum.AcceptedDeal && i.getSettlementDate().beforeOrEqual(startDate.findDay(i.getDealDate(), 2, true)) }); ),则需要使用大括号。而且,当您要声明局部变量时,不能使用该单行语法。

请参阅here以获得正式文档!

换句话说:当您要编写多个语句(例如实际定义局部变量)时,则需要这些花括号!

最后:请小心您在这里所做的事情。 (imho)Lambda表达式应该真正简短。当它们变得“更加复杂”时(例如:它们需要局部变量),那么我建议不要使用lambda,而是声明一个实际方法并调用它。

答案 1 :(得分:4)

只需在lambda中使用代码块,然后在其中声明变量即可。

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;
            });
}

答案 2 :(得分:3)

lambda表达式是匿名类使用单个方法实现接口的快捷方式。

您可以在该唯一方法中定义自己喜欢的任何东西。

lambda表达式:

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

等效于:

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

根据需要编写ReturnType的接口派生的匿名类的种类,也可以是void,并且参数的数量可以为0,或任意数量的参数(在此情况下两个类型为ATypeBType的参数)

以下形式的lambda表达式:

(a, b) -> something

是另一个快捷方式,等效于:

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

在这种情况下,您必须将第一种形式的lambda表达式与块{ }配合使用,并且可以在方括号内定义任何种类和数量的变量

答案 3 :(得分:1)

您需要将其扩展为代码块;

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