我对功能接口很陌生,并且不知道如何将其作为参数传递。我希望你能帮助我。所以我有一个叫做NumberValidation的类:
public class NumberValidation {
public static Predicate<CommonNumber> isExisting(Function<CommonNumber, CommonNumber> retrieve){
return (p ->{
return Optional.ofNullable(retrieve.apply(p)).isPresent();
});
}
public static Predicate<CommonNumber> isNotExisting(Function<CommonNumber, CommonNumber> retrieve){
return (p ->{
return !Optional.ofNullable(retrieve.apply(p)).isPresent();
});
}
}
如您所见,我有两个函数,分别是isExisting
和isNotExisting
,它们的参数为Function<CommomNumber, CommonNumber>
。假设我想使用以下功能之一:
public CommonNumber apply(CommonNumber t) {
return Optional.of(t).filter(p -> {
return NumberValidation.isExisting(//parameter here);
});
}
我不知道如何传递该参数。我尝试了return NumberValidation.isExisting(t)
和return NumberValidation.isExisting(p)
,但由于要求的参数是Function<CommonNumber,CommonNumber>
答案 0 :(得分:3)
我不确定您要在这里做什么。我发现您的代码存在三个问题,第一个可能会回答您的问题:
1)您需要将Function<CommonNumber, CommonNumber>
传递到numberValidating.isExisting()
中。也就是说,该函数接受CommonNumber
并返回CommonNumber
。我不知道那应该从哪里来。这似乎是您要问的问题,但是如果您拥有其中之一,或使用Lambda构造了其中一个,那么将//parameter here
传递到那里应该没有问题。
2)您正在传递一个Lambda,该Lambda返回Predicate
到您的filter()
方法中,但是filter()
需要一个Predicate
。因此,我认为您不想要多余的Lambda。我认为您想直接传递调用NumberValidation.isExisting()
的结果。
3)您对filter()
的调用将返回一个Optional<CommonNumber>
,但是您试图将其作为CommonNumber
进行返回。因此,您需要从CommonNumber
中取出Optional
并将其返回。
将这三个想法应用到您的代码中,这里可以进行编译。我认为您可能希望传递比p -> p
更有趣的函数。另外,我不知道您是否要检查Optional
并返回不包含CommonNumber
的其他内容。无论如何,这应该可以帮助您入门:
public CommonNumber apply(CommonNumber t) {
return Optional.of(t).filter(NumberValidation.isExisting(p -> p)).get();
}
您的NumberValidation
类似乎还可以。
如果p -> p
不能完全回答如何将Function<CommonNumber, CommonNumber>
传递到方法中,下面是另一个示例,它更明确地创建了这样的函数:
static CommonNumber someCommonNumberProcessor(CommonNumber cn) {
return cn;
}
public CommonNumber apply(CommonNumber t) {
return Optional.of(t).filter(NumberValidation.isExisting(Test2::someCommonNumberProcessor)).get();
}
所有这些都在名为Test2
的类中。