在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关键字