函数式接口 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
一、什么是函数式接口?
只包含一个抽象方法的接口,称为函数式接口。
、你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。
我们可以在任意函数式接口上使用@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。
二、自定义函数 示例代码一:
1 2 3 4 @FunctionalInterface public interface MyNumber { public double getValue () ; }
示例代码二:函数式接口中使用泛型
1 2 3 4 @FunctionalInterface public interface MyFunc <T > { public T getValue (T t) ; }
三、作为参数传递Lambda表达式 示例代码:
1 2 3 4 5 6 7 public String strHandler (String str, MyFunction mf) { return mf.getValue(str); } 作为参数传递Lambda表达式: String trimStr = strHandler("\t\t 哈哈 " , (str) -> str.trim()); String upperStr = strHandler("abcdefg" , (str) -> str.toUpperCase()); String newStr = strHandler("哈哈哈哈哈哈" , (str) -> str.substring(2 , 5 ));
作为参数传递Lambda表达式:为了将Lambda表达式作为参数传递,接收Lambda表达式的参数类型必须是与该Lambda表达式兼容的函数式接口的类型。
四、Java内置四大核心函数式接口 在学习lambda表达式的时候,我们知道,要使用lambda表达式,我们就要创建一个函数式接口,那每次用lambda表达式的时候岂不是很麻烦,这时候,java给我们内置了四大核心函数式接口。
函数式接口
参数类型
返回类型
用途
Consumer<T>
T
void
对类型为T的对象应用操作,包含方法 void accept(T t)
Supplier<T>
无
T
返回类型为T的对象,包含方法: T get();
Function<T,R>
T
R
对类型为T的对象应用操作,并返回结果。结果为R类型的对象,包含访问 R apply(T t)
Predicate<T>
T
boolean
确定类型为T的对象是否满足某约束,并返回boolean值,包含方法 boolean test(T t)
BiFunction<T,U,R>
对类型为T,Uc参数应用操作,返回R类型的结果,包含方法为: R apply(T t ,U u);
五、四大接口示例 Consumer<T>
,消费型接口 Consumer<T>
: 消费型接口,void accept(T t);
代码示例:
1 2 3 4 5 6 7 @Test public void consumerTest () { happy(1000 , m -> System.out.println("大保健花了:" + m)); } public void happy (double money, Consumer<Double> con) { con.accept(money); }
Supplier<T>
,供给型接口 Supplier<T>
: 供给型接口,T get();
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test public void supplierTest () { List<Integer> list = getNumList(10 , () -> (int ) (Math.random() * 100 )); list.forEach(System.out::println); } public List<Integer> getNumList (int num, Supplier<Integer> sup) { List<Integer> list = new ArrayList<>(); for (int i = 0 ; i < num; i++) { Integer n = sup.get(); list.add(n); } return list; }
Function<T, R>
: 函数型接口 Function<T, R>
: 函数型接口,R apply(T t);
示例代码:
1 2 3 4 5 6 7 8 9 10 11 @Test public void functionTest () { String trimStr = strHandler("\t\t 你好,world! " , (str) -> str.trim()); System.out.println(trimStr); String sumString = strHandler("Helloworld!" , (str) -> str.substring(2 , 4 )); System.out.println(sumString); } public String strHandler (String str, Function<String, String> func) { return func.apply(str); }
Predicate<T>
: 断言型接口 Predicate<T>
: 断言型接口,boolean test(T t);
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test public void predicateTest () { List<String> list = Arrays.asList("Hello" , "world" , "hi" , "o" , "123" ); List<String> filterStr = filterStr(list, (str) -> str.length() > 1 ); for (String string : filterStr) { System.out.println(string); } } public List<String> filterStr (List<String> list, Predicate<String> pre) { List<String> list2 = new ArrayList<>(); for (String str : list) { if (pre.test(str)) { list2.add(str); } } return list2; }
参考资料 函数式接口