Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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 8中实现filter()函数_Java_Java 8_Java Stream_Functional Interface - Fatal编程技术网

使用函数接口作为参数在Java 8中实现filter()函数

使用函数接口作为参数在Java 8中实现filter()函数,java,java-8,java-stream,functional-interface,Java,Java 8,Java Stream,Functional Interface,这是一段代码片段,尝试在filter函数中使用函数接口 Function<Path, Boolean> isNotPartitionFile = (path) -> { return !path.toString().contains("partition"); }; List<Path> pathsList = Files.walk(Paths.get(extractFilesLocation))

这是一段代码片段,尝试在filter函数中使用函数接口

Function<Path, Boolean> isNotPartitionFile = (path) -> {
    return !path.toString().contains("partition");
};

List<Path> pathsList =  Files.walk(Paths.get(extractFilesLocation))
                                 .filter(Files::isRegularFile)
                                 .filter(isNotPartitionFile)
                                 .collect(Collectors.toList());
函数isNotPartitionFile=(路径)->{
return!path.toString()包含(“分区”);
};
List pathsList=Files.walk(path.get(extractFilesLocation))
.filter(文件::isRegularFile)
.filter(isNotPartitionFile)
.collect(Collectors.toList());

当我尝试使用
isNotPartitionFile
作为
filter()
函数的参数时,eclipse会弹出一个错误,指出
方法过滤器(谓词
isNotPartitionFile
应定义为:

Predicate<Path> isNotPartitionFile = path -> !path.toString().contains("partition");
谓词isNotPartitionFile=path->!path.toString()包含(“分区”);

因为
filter
使用的是
谓词
而不是
函数

谓词
是一个函数,它接受一个值并总是返回
布尔值
。filter
需要的是
谓词
而不是
函数
。原因
谓词
不扩展
函数ion
是因为
谓词
返回的
布尔值
不能为空。若要解决此问题,可以将
isNotPartitionFile
更改为

Predicate<Path> isNotPartitionFile = (path) -> path.toString().contains("partition");
谓词isNotPartitionFile=(path)->path.toString()包含(“分区”);

我自己想出了解决办法

filter
函数需要一个函数作为参数,但传递了一个函数接口。因此需要将其替换为
函数
接口的
apply
函数

List<Path> pathsList =  Files.walk(Paths.get(extractFilesLocation))
                                 .filter(Files::isRegularFile)
                                 .filter(isNotPartitionFile::apply)
                                 .collect(Collectors.toList());
List pathsList=Files.walk(path.get(extractFilesLocation))
.filter(文件::isRegularFile)
.filter(isNotPartitionFile::apply)
.collect(Collectors.toList());
将谓词作为参数应用

谓词是一个布尔值函数

Function<Path, Boolean> isNotPartitionFile = (path) -> {
    return !path.toString().contains("partition");
};

List<Path> pathsList =  Files.walk(Paths.get(extractFilesLocation))
                                 .filter(Files::isRegularFile)
                                 .filter(isNotPartitionFile)
                                 .collect(Collectors.toList());
试试这个:

Predicate<Path> isNotPartitionFile = path -> !path.toString().contains("partition");
谓词isNotPartitionFile=path->!path.toString()包含(“分区”);

为什么要将它存储为
函数而不是
谓词
?为什么
isNotPartitionFile
声明为
函数
?将其更改为
谓词
不是更简单吗?无论好坏,
谓词
都不会扩展
函数
。使用
谓词
@RavindraRanwala你确定吗?
过滤器
需要
谓词
,没有允许
函数
过滤器
,那么如果
函数
不是任何
谓词
的子类型,它怎么能在eclipse中工作呢?顺便说一句
如果(条件)return true;else return false
可以简化为
返回条件;
。由于lambda
(参数)->{return value;}
可以简化为
(参数)->value
您可以将其重写为
路径->!path.toString()。包含(“分区”);
筛选器函数需要一个函数作为参数,但传递了一个函数接口“没有多大意义,这表明您误解了函数接口。函数并不意味着接口必须是
函数类型
,但该接口必须只有一个抽象方法。因此
函数
是函数接口,因为但仅仅因为它有一个抽象方法:
B apply(A)
。另外,
谓词
是函数接口,因为它正好包含一个表示
A->boolean
映射的抽象方法。类似地,
供应商
消费者
。现在
isNotPartitionFile::apply
将在您的情况下工作,因为它将表示类似于
谓词谓词=(路径)->isNotPartitionFile.apply(路径)