java函数式接口
一 简介
函数式接口简单理解就是把方法可以作为对象传递操作。
之前需要传递方法一般都是两种方式,
一种方式是使用匿名类,最常见的就是集合的排序方法sort经常被传入一个用于排序比较的匿名类。
另一种方式就是使用策略模式,把实现了策略接口的对象作为方法传递。
现在java的函数式接口和lambda表达式丰富并简化了方法的传递。
二 使用
在接口上添加@FunctionalInterface声明使它成为函数式接口
函数式接口只允许有一个抽象方法(很显然,这就是那个要被传递使用的方法)
例如我们可以这样创建一个函数式接口:
@FunctionalInterface public interface Function<T, R> { R apply(T t); }
创建对象时可以使用lambda表达式创建,例如:
Function fuc = (x) -> { x.length() }
其他方法就可以通过接收接口参数执行接收到的方法。
例如操作集合常用的java.lang.Iterable 的 foreach方法中就被要求传入一个实现了内置函数式接口Consumer的实例对象:
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
如下代码就是利用foreach方法把list中的所有元素输出至控制台。foreach()括号内的代码其实就是创建了一个函数式接口Consumer的实例对象
list.forEach((x)->System.out.println(x));
三 java内置常用函数式接口
除了上面提到的Consumer外,java还有Supplier等其他接口,全都在java.util.function包内,他们的主要区别就是抽象方法的参数和返回值的数量以及类型不一样。
四 lambda 表达式中的双冒号::
使用双冒号可以更方便的从已有类或对象中创建出函数式接口的对象
例如上述foreach的代码就可以简写成list.forEach(System.out::println);
双冒号共有四种使用方法:
对象::实例方法
类::实例方法
类::静态方法
类:new