我对功能接口很陌生,并且不知道如何将其作为参数传递。我希望你能帮助我。所以我有一个叫做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>
,所以我不断收到错误消息 最佳答案
我不确定您要在这里做什么。我发现您的代码存在三个问题,第一个可能会回答您的问题:
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
的类中。关于java - 将功能接口(interface)作为参数传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55895746/