使用函数接口作为参数在Java 8中实现filter()函数
这是一段代码片段,尝试在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))
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(路径)
。