我对功能接口很陌生,并且不知道如何将其作为参数传递。我希望你能帮助我。所以我有一个叫做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();
        });
    }
}


如您所见,我有两个函数,分别是带有参数isExistingisNotExistingFunction<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/

10-08 23:46