通过之前的函数式接口与lambda表达式的关系那篇文章,大家应该对函数式接口有了一定的了解了,在Java中它是lambda表达式的基础,没有函数式接口就没有办法使用lambda表达式。
函数式接口如此重要,所以Java8 API给我们提供了除了以前就有的Comparator接口和Runnable接口外,还提供了很多全新的函数式接口使用。下面介绍几个这些接口:
Predicate<T>接口
这个接口顾名思义,是一个用来判断的接口,其中的唯一抽象方法为:boolean test(T t);
,其接受T类型一个参数,返回一个boolean值,我们可以用来对这个参数进行一系列自己定义的判断方法并返回结果。举例:
Predicate<String> predicate = a -> a.indexOf("java") != -1; // 用来判断是否含有「java」字符串 boolean test1 = predicate.test("java"); // true boolean test2 = predicate.test("jva"); // false
Predicate接口的其他默认方法还有:
Predicate<T> and(Predicate<? super T> other) // 与 Predicate<T> negate() // 取反 Predicate<T> or(Predicate<? super T> other) // 或
Function<T, R>接口
这个接口用来表示一个函数,接收一个类型的参数,返回一个类型结果。其唯一的抽象方法为:R apply(T t);
,用来接收一个T类型的参数,返回一个R类型的值。例子如下:
Function<String, Integer> function = a -> Integer.valueOf(a); // 可以简写为 = Integer::valueOf Integer apply = function.apply("0123"); // 结果为:123
Function接口的其他默认方法还有:
Function<V, R> compose(Function<? super V, ? extends T> before) // 先执行参数中的函数,后执行自身的 Function<T, V> andThen(Function<? super R, ? extends V> after) // 先执行自身的,后执行参数中的函数
Supplier<T>接口
Supplier接口产生一个给定类型的结果,并且没有输入参数。唯一的抽象方法为:T get();
,使用例子如下:
Supplier<Person> supplier = () -> { return new Person(); }; // 可以简写为 supplise = Person::new; Person person = supplier.get();
Consumer<T>接口
这个接口表示对于一个输入参数进行运算,与Function接口的不同是,它没有返回结果。其唯一的抽象方法为:void accept(T t);
,使用例子如下:
Consumer<int[]> consumer = n -> { for (int i = 0; i < n.length; i++) { System.out.println(n[i]); } }; int[] nums = {1, 2, 3, 4, 5}; consumer.accept(nums); // 依次在每行输出一个数字
对于函数式接口暂时就介绍到这里,在java8 API中还有许多这样的接口,大家可以自己探索使用。