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

在java中,如何在if lambda条件中声明变量?,java,lambda,java-8,Java,Lambda,Java 8,在我的代码中,我有一个谓词方法,如果满足某些条件,它将返回i,我需要在其中声明一个变量,但该方法是用lambda编写的,我不知道如何执行。 这是我的密码: public static Predicate<MFDWHDealExt> isAccepted() { MyCalendar startDate = new MyCalendar(); return (i -> i.getCompany().equals(

在我的代码中,我有一个谓词方法,如果满足某些条件,它将返回
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))
                );
    }
公共静态谓词isAccepted(){
MyCalendar startDate=新的MyCalendar();
返回(i->
i、 getCompany()等于(“已接受”)
&&i.getDealType()==MFDealTypeEnum.AcceptedDeal
&&i.getSettlementDate().beforeQual(startDate.findDay(i.getDealDate(),2,true))
);
}

我需要用
i.getSettlementDate
的值声明
startDate
(自定义日期
MyDate
),否则方法
findDay
(返回工作日),因为现在是
null

,需要将其扩展到代码块

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

如果使用lambdas的单行语法,如
x->2*x
,则需要块大括号。当你打算声明一个局部变量时,你不能使用这一行语法

有关官方文档,请参阅

换句话说:当你想写几个语句,比如定义一个局部变量时,你需要这些大括号


最后:在这里要小心。Lambda表达式应该非常简短。当它们变得“更复杂”(比如:它们需要局部变量)时,我建议不要使用lambda,而是声明一个真正的方法并调用它。

只需在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;
            });
}
公共静态谓词isAccepted(){
MyCalendar startDate=新的MyCalendar();
返回(i->{
MyDate startDate=i.getSettlementDate();
布尔结果=i.getCompany().equals(“已接受”)
&&i.getDealType()==MFDealTypeEnum.AcceptedDeal
&&startDate.beforeQual(startDate.findDay(i.getDealDate(),2,true));
返回结果;
});
}

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

你可以在这个独特的方法中定义你喜欢的任何东西

lambda表达式:

 (a, b) -> {
    // Your code here      
 }
(a, b) -> something
相当于:

 new MyInterface() {
    public ReturnType uniqueMethod(AType a, BType b) {
        // Exactly the same code here
    }
 }
根据从接口派生的匿名类的类型,您需要编写
ReturnType
也可以是
void
,参数的数量可以是0,也可以是任意数量的参数(在这种情况下,类型为
AType
BType
的两个参数)

lambda表达式的以下形式:

 (a, b) -> {
    // Your code here      
 }
(a, b) -> something
是另一种快捷方式,相当于:

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

在您的例子中,您必须将lambda表达式的第一种形式应用于块
{}
,并且您可以在括号内定义任何类型和数量的变量

声明您不使用的变量不会产生任何作用。如果i.getSettlementDate执行此任务,您可以直接调用它。不幸的是,这不起作用,我在i.getCompany()上得到一个编译错误“this not a statement”。编辑:没关系,我忘了第二次返回。现在可以了,谢谢!如果使用带大括号的版本,则需要添加return关键字