函数式接口
函数式接口指的是接口中只有一个抽象方法的接口,用注解
@FunctionalInterface
标记,表示该接口是函数式接口
注解FunctionalInterface
如图,可以看到这里什么都没有,表面它只是一个标记接口.
网络异常,图片无法展示
|
四大接口
Consumer
源码如下:
网络异常,图片无法展示
|
作用: 内部消化传进来的参数, 没有返回值
示例:
Consumer<String> consumer=System.out::println; consumer.accept("Consumer"); // 结果: "Consumer" 复制代码
Supplier
源码如下:
网络异常,图片无法展示
|
作用: 没有传参 , 直接返回一个结果
示例:
Supplier<String> supplier= () -> "Supplier"; System.out.println(supplier.get()); // 结果: "Supplier" 复制代码
Function
额这个源码太长了,截取部分源码如下:
网络异常,图片无法展示
|
可以看到它是综合了这个consumer
和Supplier
🐖
作用: 根据传的参数,返回一个结果,这里是既有传参,又有返回值😝
示例:
Function<String,String> func= String::toUpperCase; System.out.println(func.apply("Function")); // 结果: "FUNCTION" 复制代码
Predicate
这个源码也比较长,截取部分源码如下:
网络异常,图片无法展示
|
作用: 判断给的参数是否符合条件,返回 false 或者 true
示例:
Predicate<String> predicate= "predicate"::equals; System.out.println(predicate.test("predicate")); // 结果: true 复制代码
可以看到还是特别简单滴~
小例子
再举个小例子 (大家都熟悉的 hashmap
)
@Test public void mergeTest(){ String key="java4ye"; HashMap<String, Integer> map=new HashMap<>(); map.put(key,1); // 写法1 map.merge(key,2,Integer::sum); System.out.println(map.get(key)); // 写法2 Integer integer = map.get(key); if (integer!=null){ integer+=2; map.put(key,integer); } System.out.println(map.get(key)); } // 3 // 5 复制代码
这里就用到这个 Function
函数式接口啦~ 对比这两种写法,是不是发现第一种简洁多啦!
而且我们又 get 到另外一个概念,lambda
表达式,通过第一种写法,我们也可以很快认识到,lambda
表达式其实是实现函数式接口的一个快捷方式~