将功能接口作为参数传递

时间:2019-04-29 00:33:49

标签: java java-8

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

如您所见,我有两个函数,分别是isExistingisNotExisting,它们的参数为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 个答案:

答案 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的类中。