再看一个栗子:
/** * @author vchicken * @version 1.0 * @description FunctionTest * @date 2022/11/10 12:10:06 */public class FunctionTest<T,R> {public static void main(String[] args) {FunctionTest<Integer, Integer> functionTest1 = new FunctionTest<>();System.out.println(functionTest1.functionTest(null, s -> s == null ? 0 : s));System.out.println(functionTest1.functionTest(100, s -> s == null ? 0 : s));System.out.println(functionTest1.functionTest(10, s -> s + 1));FunctionTest<String, String> functionTest2 = new FunctionTest<>();System.out.println(functionTest2.functionTest(null, s -> s == null ? "空的" : s));System.out.println(functionTest2.functionTest("hello world!", s -> s == null ? "空的" : s));}public R functionTest(T in,Function<T,R> function){return function.apply(in);}}
执行结果:
010011空的hello world!
结合两个栗子我们可以看出来:
我们可以使用Function接口来将同一个方法的处理逻辑抽象出来,在调用方法的时候,将处理逻辑以Lambda表达式的形式传入,实现同一个方法可以处理不同的代码逻辑,而且使用泛型来表示方法的出入参,可以避免不必要的类型转换和异常发生 。@vchickenFunction接口在JDK中的应用在JDK1.8中的新属性Stream中,就使用到了Function接口,看下面的源码:
文章插图
通过一个例子来看看怎样使用map这个接口
public static void main(String[] args) {Stream<Integer> stream = Stream.of(-1,0,1,2,3,4);Stream<Integer> stream1 = stream.map(integer -> integer + 1);stream1.forEach(System.out::println);}
执行结果:012345
案例:将数组中的数,依次平方,等到一个一个新的数组List<Integer> myList = new ArrayList<>();myList.add(-2);myList.add(0);myList.add(1);myList.add(3);myList.add(5);myList.add(7);List<Integer> collect = myList.stream().map(integer -> integer*integer).collect(Collectors.toList());collect.forEach(System.out::println);
执行结果:40192549
2.Consumer接口什么是Consumer接口?文章插图
从源码可以看出,Consumer与Function类似,只有一个accept抽象方法待实现,只不过唯一的区别是,Consumer的accept使用void修饰,没有返回值 , 而Function有返回值 。
Consumer接口又称为
消费型接口
, 顾名思义 , 入参传入后,被accept方法消费掉了,什么都没得到 。举个栗子:
public static void main(String[] args) {Consumer<Object> consumer1 = new Consumer<Object>() {@Overridepublic void accept(Object o) {System.out.println("这次消费了:" + o.toString());}};consumer1.accept("100w元在双十一!这下穷死了!");Consumer<String> consumer2 = s -> System.out.println("这次消费了:" + s);consumer2.accept("120w元在双十二!又穷死了!");}
执行结果:这次消费了:100w元在双十一!这下穷死了!这次消费了:120w元在双十二!又穷死了!
同样的,我们可以提取公共方法为:/** * @author vchicken * @version 1.0 * @description ComsumerTest * @date 2022/11/10 17:14:11 */public class ConsumerTest<T> {public static void main(String[] args) {ConsumerTest<String> consumerTest = new ConsumerTest<>();consumerTest.accept("100w元在双十一!这下穷死了!", s -> System.out.println("这次消费了:" + s));consumerTest.accept("120w元在双十二!又穷死了!", s -> System.out.println("这次消费了:" + s));}public void accept(T in, Consumer<? super T> consumer) {consumer.accept(in);}}
执行结果:这次消费了:100w元在双十一!这下穷死了!这次消费了:120w元在双十二!又穷死了!
Consumer接口在JDK中的应用文章插图
同样的 , 我们以Stream中的forEach为例,看下面的例子:
Stream<Integer> stream = Stream.of(-1,0,1,2,3,4); stream.forEach(s-> System.out.println(s));
执行结果:-101234
同样的我们还可以使用方法引用来打印,效果一致stream.forEach(System.out::println);
对于方法引用不了解的亲,也可以阅读这篇文章Java8 新特性 - 方法引用@vchicken3.Suppiler接口什么是Suppiler接口?既然我们上面说到了Consumer为
消费型接口
,按照惯例,那肯定有生产型接口
或者也可以成为
推荐阅读
- 剑侠世界3新职业长歌技能详解攻略
- realme笔记本最新消息_realme笔记本即将发布
- 怎么玩今日头条(新手使用今日头条)
- Electron是什么以及可以做什么
- 2022蚂蚁庄园8月13日答案最新
- 云顶之弈8月11日12.15版本更新维护公告
- 英雄联盟LOL8月11日12.15更新内容图文汇总
- 金铲铲之战2022.8.11更新维护内容一览
- 线上Electron应用具备哪些特征?
- 明日之后8月12日海洋版本更新开服时间说明-明日之后海洋版本进不去怎么办