Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将函数接口作为参数传递_Java_Java 8 - Fatal编程技术网

Java 将函数接口作为参数传递

Java 将函数接口作为参数传递,java,java-8,Java,Java 8,我对函数接口非常陌生,在将其作为参数传递时不知道如何做到这一点。我希望你能帮我。我有一个叫做NumberValidation的课程: public class NumberValidation { public static Predicate<CommonNumber> isExisting(Function<CommonNumber, CommonNumber> retrieve){ return (p ->{

我对函数接口非常陌生,在将其作为参数传递时不知道如何做到这一点。我希望你能帮我。我有一个叫做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();
        });
    }
}

我不知道如何传递那个参数。我尝试了return NumberValidation.isExistingt和return NumberValidation.isExistingp,但由于所需参数是一个函数,我不确定您在这里要做什么。我发现您的代码有三个问题,第一个可能回答了您的问题:

1您需要将函数传递到numberValidating.isExisting。也就是说,一个接受CommonNumber并返回CommonNumber的函数。我不知道这是从哪里来的。这似乎是您要问的问题,但是如果您有其中一个,或者使用Lambda构造了一个,那么在这里传递//参数应该没有问题

2您正在将返回谓词的Lambda传递到filter方法中,但filter接受谓词。所以我想你不需要额外的Lambda。我想您想直接传递调用NumberValidation.isExisting的结果

3您对筛选器的调用将返回可选的,但您正试图将其作为公用号码返回。因此,您需要从可选项中获取CommonNumber并返回它

将这三个概念应用到代码中,下面是一些编译过程。我想你可能想要传递一个比p->p更有趣的函数。另外,我不知道您是否希望检查可选项,如果它不包含CommonNumber,则返回不同的内容。无论如何,这应该让你开始:

public CommonNumber apply(CommonNumber t) {
    return Optional.of(t).filter(NumberValidation.isExisting(p -> p)).get();
}
你的数学课看起来还可以

如果p->p不能完全回答如何将函数传递到方法中,下面是另一个更明确地创建此类函数的示例:

static CommonNumber someCommonNumberProcessor(CommonNumber cn) {
    return cn;
}

public CommonNumber apply(CommonNumber t) {
    return Optional.of(t).filter(NumberValidation.isExisting(Test2::someCommonNumberProcessor)).get();
}

这都在一个名为Test2的类中。

我正在尝试使用isExisting函数并传递一个函数参数。感谢您提供了这一信息性的响应。我不太熟悉使用功能界面,所以我正在做一个尝试和错误,谷歌搜索这一个。这真的帮了我很大的忙我推荐一本很好的书。。。。这就是我如何开始使用Java中所有新的功能性内容,包括流。溪流是如此的凉爽。只要仔细阅读本书中的例子,你就会非常兴奋。强烈推荐。我刚刚注意到在那个页面上有一个更新的版本。我得检查一下。我有一个Oreilly Learning订阅,它让我可以访问几乎所有的科技书籍,所以我被宠坏了:。但也许这意味着你可以很便宜地找到一本原著的副本,而且它仍然是学习这些东西的一本好书……或者注册一个免费试用的,lol。一个像Optional.oft.filter…get这样的表达式,不管你使用什么谓词,它都会被破坏。结果要么是与之前相同的t,要么是异常,因为拒绝的值会导致一个空的可选值,该可选值在get时没有返回值。这里没有办法修复它,因为任务本身在逻辑上有缺陷,一个函数返回基于该函数的过滤器的任何内容,一个没有实际应用程序逻辑的完美循环。
static CommonNumber someCommonNumberProcessor(CommonNumber cn) {
    return cn;
}

public CommonNumber apply(CommonNumber t) {
    return Optional.of(t).filter(NumberValidation.isExisting(Test2::someCommonNumberProcessor)).get();
}