BiPredicate函数接口Java示例
在这篇文章中,我们将看到java.util.function.BiPredicate函数接口的示例。
BiPredicate函数接口表示一个布尔值函数,该函数带有两个参数并返回true或者false。该函数接口中的抽象方法是
test(T t,U u)–此方法对传递的参数评估谓词,并根据输入参数是否与谓词匹配来返回true或者false。
如果编写的Lambda表达式带有两个参数,并使用这些参数评估返回true或者false的条件,则可以将该Lambda表达式编写为BiPredicate内置函数接口的实现。
除了test(T t,U u)抽象方法之外,谓词接口还具有以下默认接口方法。
- and(BiPredicate <?super T,?super U> other)–此默认方法返回一个组合谓词,该谓词表示此谓词与另一个谓词的短路逻辑与。
- or(BiPredicate <?super T,?super U> other)–此默认方法返回一个组合的谓词,该谓词表示此谓词和另一个谓词的短路逻辑或者。
- negate()–此默认方法返回一个谓词,该谓词表示所传递谓词的逻辑否定(反向条件)。
BiPredicate接口test()方法示例
import java.util.function.BiPredicate; public class BiPredicateExample { public static void main(String[] args) { BiPredicate<String, String> bp = (s1, s2) -> s1.equals(s2); boolean val = bp.test("theitroad.com", "theitroad.com"); System.out.println("val is- " + val); val = bp.test("Hello", "Test"); System.out.println("val is- " + val); } }
输出:
val is- true val is- false
在示例中,此lamdba表达式BiPredicate <String,String> bp =(s1,s2)-> s1.equals(s2);是BiPredicate接口的实现。当调用带有两个参数的test()方法时,Java可以从上下文中推断出lambda表达式是test()方法的实现。
2.在第二个示例中,我们将编写一个以BiPredicate作为方法参数的方法。方法检查给定路径上的文件是常规文件还是目录。
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; import java.util.function.BiPredicate; public class BiPredicateExample { public static void main(String[] args) throws IOException { // Called with directory - returns false Path path = Paths.get("F:\theitroad\Parent"); System.out.println(isFile(path, (p, fileAttributes) -> fileAttributes.isRegularFile())); // Called with File - returns false path = Paths.get("F:\theitroad\Parent\Test.txt"); System.out.println(isFile(path, (p, fileAttributes) -> fileAttributes.isRegularFile())); } private static boolean isFile(Path path, BiPredicate<Path, BasicFileAttributes> matcher) throws IOException { return matcher.test(path, Files.readAttributes(path, BasicFileAttributes.class)); } }
输出:
false true
JDK中的BiPredicate函数接口
这些内置的函数接口被Java语言本身广泛使用。我们可以在Files.find()方法中优化BiPredicate函数接口的用法。
Stream <Path>查找(路径开始,int maxDepth,BiPredicate <Path,BasicFileAttributes>匹配器,FileVisitOption…选项)–该方法通过在给定路径中搜索文件来返回由Path懒散填充的Stream。流中将包含的文件由传递的BiPredicate确定。
这是一个示例,列出了传递的目录及其子目录中的所有文件,深度最大为10.
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.stream.Stream; public class BiPredicateExample { public static void main(String[] args) throws IOException { Path startPath = Paths.get("F:\theitroad\Parent"); Stream<Path> fileStream = Files.find(startPath, 10, (path, fileAttributes) -> fileAttributes.isRegularFile()); fileStream.forEach(System.out::println); fileStream.close(); } }