在我的代码中,我有一个谓词方法,如果满足某些条件,它将返回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
。
答案 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,或任意数量的参数(在此情况下两个类型为AType
和BType
的参数)
以下形式的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));
});