BiPredicate函数接口Java示例

时间:2020-01-09 10:35:15  来源:igfitidea点击:

在这篇文章中,我们将看到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();
  }
}