JDK1.8 函数式接口 Consumer & Supplier 以及 JAVA新纪元 λ表达式的到来

背景什么的被吞了,直接进入主题


函数式接口(定义自己百度,一大堆)

因为看了一些关于JDK1.8函数式接口的文章,发现基本上都是糊里糊涂一笔带过.所以就抽空赶紧整理了一下.

还是附上几个学习了解的传送门 :

  • 菜鸟教程
  • 易百教程
  • 汇智网

Consumer 函数式接口

JDK 源码

/*** 接受单个输入参数并且不返回结果的操作。* 与大多数其他功能接口不同, Consumer预期通过副作用进行操作。** @since 1.8*/
@FunctionalInterface
public interface Consumer<T> {/*** 对给定的参数执行此操作。** @param t the input argument*/void accept(T t);/*** 返回一个组合的Consumer ,依次执行此操作,然后执行after操作。 * 如果执行任一操作会抛出异常,它将被转发到组合操作的调用者。 * 如果执行此操作会引发异常,则不会执行after操作。** @param 此操作后执行的操作* @return 一个组成的 Consumer ,依次执行 after操作* @throws NullPointerException - if after is null*/default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}复制代码

刚拿过来看的时候可能会有一些绕,但是我们换个角度来看一下.

Consumer 直译过来就是消费者的意思,那我们是不是可以理解成消费代码.既然他要消费,那我们就要给他提供代码.

来看一个简单的demo

public void testConsumer1() {Consumer<String> consumer = new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s + "?");}};consumer.accept("李磊");}
复制代码

输出结果

李磊?
复制代码

简单解释一下

Consumer是一个接口,所以当我们直接使用的话,要实现其 accept()方法,而这个方法的参数,就是我们定义接口时候给到的泛型,这里给的是一个String类型,方法当中的内容,就是我们所谓的消费代码,当调用accept()方法时执行.

注意 : 也就是上面提到的通过副作用处理,我不清楚这个单词翻译的是否准确,看了很多博主和一些机器翻译都是这个意思,但我个人的理解意思,更趋近于说是通过侧面来解决问题.

再看一下 consumer.accept("李磊")这一句,这里便是真正的执行的地方,也就是调用的我们刚刚自行实现的accept()方法.

让我们继续刚刚的demo往下看

这种写法和上面在JDK1.8环境中是等价的. 主要就是利用到了1.8中的 λ 表达式.

    public void testConsumer1() {Consumer<String> consumer = s -> System.out.println(s + "?");consumer.accept("李磊");}复制代码

下面的例子均使用λ表达式完成

泛型为自定义对象时

public void testConsumerToSupplier() {Consumer<Person> consumer = person -> {person.setName("张颖");person.setSize(34);};Person person = new Person();consumer.accept(person);System.out.println("person = " + person);}复制代码

输入结果:

person = Person{name='张颖', size=34}
复制代码

泛型为自定义接口时

public interface People {void come(Person person);
}
复制代码
public void testConsumerAndInterfaceFunction() {Consumer<People> consumer = people -> {people.come(new Person("李四", 23));people.come(new Person("找钱", 34));people.come(new Person("孙俪", 45));};consumer.accept(this::print);}public void print(Person person) {System.out.println("person = " + person);}
复制代码

输出结果

person = Person{name='李四', size=23}
person = Person{name='找钱', size=34}
person = Person{name='孙俪', size=45}
复制代码

如果到了这里还没有明白怎么回事,我建议你亲自动手敲上那么一遍.真的,如果还不懂来杭州,我当面给你讲.


Supplier 函数式接口

还是一样,先看一下JDK源码

/*** 获得对象的一个函数式接口** @since 1.8*/
@FunctionalInterface
public interface Supplier<T> {/*** 得到一个对象** @return 目标对象*/T get();
}复制代码

这个是不是看起来很容易理解了,Supplier的意思是供应商,那我们是不是可以把他理解成一个商场,然后你告诉他你想要的东西是什么样子的,它是不是就会给你了.

来看一下这个简单的demo

void testSupplier1() {Supplier<String> supplier = () -> "这是你要的字符串";String str = supplier.get();System.out.println("str = " + str);}
复制代码

运行结果:

str = 这是你要的字符串
复制代码

继续自定义对象

void testSupplier2() {Supplier<Person> supplier = () -> {Person person = new Person();person.setName("张三");person.setSize(32);return person;};Person person = supplier.get();System.out.println("person = " + person);}
复制代码

运行结果

person = Person{name='张三', size=32}
复制代码

再来刺激的自定义接口

    void testSupplier3() {Supplier<People> supplier = new Supplier<People>() {@Overridepublic People get() {People people = new People() {@Overridepublic void come(Person person) {System.out.println("person = " + person)}};return people;}};People people = supplier.get();people.come(new Person("李四", 24));}复制代码

输出结果

person = Person{name='李四', size=24}
复制代码

看好别眨眼,λ表达式的写法 下面的一行和上面的一堆是等价的

void testSupplier4() {Supplier<People> supplier = () -> person -> System.out.println("person = " + person);People people = supplier.get();people.come(new Person("李四", 24));
}
复制代码

输出结果

person = Person{name='李四', size=24}
复制代码

想必看到这你不光明白了 Supplier的用法,更清楚的λ表达式的用处了.


写在最后,写这篇文章的原因是因为在整理工厂模式的时候遇到的一些问题

工厂模式简单的是不能再简单了,但是随着技术的发展,也出现了一些新颖的工厂方法.CTS便是其中之一.

至于Consumer&Supplier应用在工厂模式的代码如下,因为比较特殊,写在了一起,想要亲自体检复制粘贴运行TTT类的main()方法即可

/*** @author lvgo* @version 1.0* @Description: CTS实现工厂模式* @date 18-8-24 下午3:57*/
public interface CTS {static CTS getCts(Consumer<Peoples> consumer) {Map<String, Supplier<Persons>> map = new HashMap<>();consumer.accept(map::put);return person -> map.get(person).get();}Persons getPerson(String name);
}interface Peoples {void come(String name, Supplier<Persons> personSupplier);
}class TTT {public static void main(String[] args) {CTS cts = CTS.getCts(people -> {people.come("张三", () -> new Persons("张三"));people.come("李四", () -> new Persons("李四"));people.come("王五", () -> new Persons("王五"));});Persons person = cts.getPerson("王五");System.out.println("persons = " + person);}
}class Persons {private String name;public Persons() {}public Persons(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person{" +"name='" + name + "'}'";}
}复制代码

CTS工厂模式说明: Consumer To Supplier 自造词,无处可寻,他处偶遇纯属抄袭;

通过Peoples接口的come()方法,可以动态在CTS工厂内添加person,然后使其具于生产该实例的能力.


  • 本文所有源代码点我
  • 更多设计模式学习点我或浏览博客设计模式专栏查看

参考文献

  • Design Patterns: Elements of Reusable Object-Oriented Software 1st Edition

转载于:https://juejin.im/post/5b7fc5aaf265da4339672c76

[彻底理解]JDK1.8 函数式接口 Consumer Supplier 以及 JAVA新纪元 λ表达式的到来相关推荐

  1. 【Java 进阶】匿名类(代码传递、回调、过滤器)、Lambda表达式(方法引用)、函数式接口(Supplier、Consumer、Predicate、Function)

    匿名类 匿名类(Anonymous Class) 匿名类的使用注意 匿名类 - 代码传递 - 测试代码运行时间的工具类 匿名类 - 回调 - 简易网络请求 匿名类 - 过滤器 - 获取目录下的所有文件 ...

  2. jdk8函数式接口——Consumer介绍

    Consumer介绍与实例分析 函数式接口:@FunctionalInterface Consumer(消费者) 函数式接口:@FunctionalInterface 自从jdk8提供了函数式接口这一 ...

  3. 常用的函数式接口--Consumer接口

    Consumer java.util.function.Consumer 接口刚好和Supplier接口相反,它不是用来生产一个数据,而是消费一个数据 数据的类型由泛型来指定 accept方法 意思就 ...

  4. java accept consumer_Java 常用函数式接口 —— Consumer接口

    JDK提供了大量的函数式接口,方便我们开发的时候无需自己编写接口,这些接口都比较通用,学会他们并且在工作中使用,不仅方便的解决问题,而且十分优雅. 1.接口概述 Consumer 接口也比较简单,只有 ...

  5. 常用函数式接口-Consumer

    consumer 英 [kənˈsjuːmə(r)] 美 [kənˈsuːmər] n. 消费者:用户,顾客 java.util.function.Consumer<T> 接口则正好与Su ...

  6. 常用函数式接口之Supplier

    Supplier接口 Supplier<T>接口也被称为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据供我们使用. 常用方法 只有一个无参的方 ...

  7. JDK1.8 Consumer Supplier 什么意思

    JDK1.8 函数式接口 Consumer & Supplier 以及 JAVA新纪元 λ表达式的到来 背景什么的被吞了,直接进入主题 函数式接口(定义自己百度,一大堆) 因为看了一些关于JD ...

  8. Java 8 中需要知道的4个函数式接口-Function、Consumer、Supplier、Predicate

    前言 Java 8 中提供了许多函数式接口,包括Function.Consumer.Supplier.Predicate 等等.这 4 个接口就是本篇将要分享的内容,它们都位于 java.util.f ...

  9. Java 8 - 03 Lambda 函数式接口Predicate Consumer Function Supplier

    文章目录 Pre Predicate 断言型函数式接口 Consumer 消费型函数式接口 Function 功能型函数式接口 Supplier 供给型函数式接口 小结 函数式接口如何处理异常信息 P ...

最新文章

  1. 遗传算法来控制进入(一)
  2. 深入理解Lustre文件系统-第1篇 前言
  3. mPaaS 客户端问题排查之突如其来的“白屏”等待
  4. windows 7 睡眠和休眠的区别
  5. python mongodb查询_Python MongoDB 查找
  6. 消息队列遥测传输(MQTT)介绍
  7. 富人和穷人的八大差异
  8. 日期格式转换,正则匹配后转换;指定时间增加天数加转格式;js时间转换格式
  9. 咱也写个小写数字转大写金额 ,纯粹字符串操作实现
  10. 修改Win7启动顺序和启动菜单名称
  11. 东芝2303am维护清零_东芝打印机怎么清零
  12. 快闪类企业校园招聘H5,这么设计才够炫!
  13. flask keras 多线程环境下加载模型
  14. 决策树常见的面试点整理
  15. 【NOIP冲刺题库题解】1973:【16NOIP普及组】买铅笔
  16. element el-table 计算指定列
  17. 在html登陆页面代码中添加背景图片,为什么找不到图片放置的位置
  18. 爬取中国福彩网并做可视化分析
  19. mendeley使用技巧
  20. Google 和 Meta 正在接受欧盟和英国反垄断监管机构对”Jedi Blue”的调查

热门文章

  1. v-model双向绑定原理_Vue数据绑定
  2. yjv是电缆还是电线_电力电缆YJV与BVV二者之间的区别是什么?
  3. springcloud 子项目怎么导入_Spring Cloud基础面试题大集合
  4. chrome开发者工具功能拾遗:Sources面板篇
  5. 正则表达式之?、(?:pattern)、(?!pattern)、(?=pattern)理解及应用
  6. RabbitMQ (四)实现延迟消息
  7. tensorflow超参数优化,Tensorflow的超参数调整
  8. 怎样学python最快_如何少走弯路,快速学会Python
  9. 中setting怎么配置_用VSCode配置Latex
  10. 双轴机械臂建模分析数据