一回顾与说明

    通过之前发布的”Java8Lamda和Stream原理引入“一文章中你已经了解了为什么会有Lamda表达式的由来,Lamda表达式的基本语法等;Lamda表达式简而言之:Lamda表达式本质上就是匿名类,我们称Lamda表达式就是函数式接口的实现;

二Lamda表达式的结构与函数式接口的关系

1准备工作

例子还是之前文章关于车的例子

判断型函数式接口:

  1. /**
  2. * @Author lsc
  3. * @Description <p> </p>
  4. * @Date 2019/9/27 14:05
  5. * @Version 1.0
  6. */
  7. @FunctionalInterface
  8. public interface CarPredicate {
  9. boolean test(Car car);
  10. }

车实体类:

  1. /**
  2. * @Author lsc
  3. * @Description <p> </p>
  4. * @Date 2019/9/27 11:09
  5. * @Version 1.0
  6. */
  7. @Data
  8. @AllArgsConstructor
  9. public class Car {
  10. // 车牌号
  11. private String code;
  12. // 颜色
  13. private String color;
  14. // 生产商
  15. private String factory;
  16. // 价格
  17. private double price;
  18. }

初始化实例函数:

  1. public List<Car> InitCar(){
  2. ArrayList<Car> carList = new ArrayList<>();
  3. Car car1 = new Car("100", "black", "中国", 20);
  4. Car car2 = new Car("101", "gray", "中国", 30);
  5. Car car3 = new Car("102", "yello", "中国", 50);
  6. Car car4 = new Car("103", "silvery", "英国", 20);
  7. Car car5 = new Car("104", "red", "英国", 30);
  8. carList.add(car1);
  9. carList.add(car2);
  10. carList.add(car3);
  11. carList.add(car4);
  12. carList.add(car5);
  13. return carList;
  14. }

根据条件获得车函数:

  1. public List<Car> getCarByPredicate(List<Car> carList, CarPredicate carPredicate){
  2. ArrayList<Car> resultList = new ArrayList<>();
  3. for (Car car : carList){
  4. if (carPredicate.test(car)){
  5. resultList.add(car);
  6. }
  7. }
  8. return resultList;
  9. }

2 Lamda 的结构

我们之前用Lamda是这样调用:

  1. @Test
  2. public void getCarByPredicatByLamda(){
  3. // 初始化车信息
  4. List<Car> cars = carFunFactory.InitCar();
  5. // 获取颜色为红色的车
  6. List<Car> carByPrice1 = carFunFactory.getCarByPredicate(cars,car -> car.getPrice()>30);
  7. // [Car(code=102, color=yello, factory=中国, price=50.0)]
  8. System.out.println(carByPrice1);
  9. }

图解Lamda 结构

3 Lamda与函数式接口的关系与类型推断

再次强调:Lamda表达式是对函数式接口的实现



类型​推断:



类型推断void:​

  1. // void 兼容 Lamda一句表达式的函数签名
  2. @Test
  3. public void runnableTest(){
  4. Runnable runnable = () -> System.out.println("欢迎关注youku1327");
  5. runnable.run();
  6. }

图解void类型推断​:



没有类型推断:

三内置函数式接口

1 Predicate<T>

java.util.function.Predicate;函数签名:boolean test(T t);

我们可以实现的Lamda函数签名:T -> boolen;

示例:

  1. @Test
  2. public void predicateTest(){
  3. Predicate predicate = s -> s.equals("youku1327");
  4. boolean youku1327 = predicate.test("youku1327");
  5. System.out.println(youku1327);//true
  6. }

2 Consumer<T>

java.util.function.Consumer;函数签名: void accept(T t);

我们可接受的Lamda函数签名:T -> void;

  1. @Test
  2. public void consumerTest(){
  3. Consumer consumer = s -> System.out.println(s);
  4. consumer.accept("youku1327");//youku1327
  5. }

3Function<T, R>

java.util.function.Function;函数签名​:R apply(T t);

我们可接受的Lamda函数签名:T -> R;​

  1. @Test
  2. public void functionTest(){
  3. ArrayList<Object> list = new ArrayList<>();
  4. Function function = s -> list.add(s);
  5. function.apply("youku1327");
  6. System.out.println(list);//[youku1327]
  7. }

4 Supplier<T>

java.util.function.Supplier;函数签名: T get();

我们可以接受的Lamda函数签名: void -> T

  1. @Test
  2. public void supplierTest(){
  3. ArrayList<Object> list = new ArrayList<>();
  4. Supplier supplier = () -> "youku1327";
  5. System.out.println(supplier.get());//youku1327
  6. }

四 致谢

感谢观看Lamda与函数式接口的入门原理篇,有梦想的程序员,学技术不仅学使用方法,还要学原理,你将技术当工具,技术何尝不是把你当工具,想要系统学习快关注我的公众号吧;

java8-详解Lamda表达式的更多相关文章

  1. java8的新特性详解-----------Lamda表达式

    java8最大的亮点就是引入了Lamda表达式  , 函数式编程的概念  具体啥意思我也不知道.只管用就行了,非常的强大,简洁,一个表达式相当于以前的十几行代码  因为之前要实现这种效果全靠if el ...

  2. Cron表达式详解和表达式的验证

    本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表达式 这两篇文章. cron校验的 ...

  3. JAVA8新特性——Lamda表达式

    JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类. 先来看看传统的匿名 ...

  4. Java8特性详解 lambda表达式 Stream

    1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...

  5. Java8特性详解 lambda表达式 Stream【转】

    本文转自http://www.cnblogs.com/aoeiuv/p/5911692.html 1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有 ...

  6. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  7. 【jsp】详解JSP表达式语言(EL)

    一.JSP EL语言定义 E L(Expression Language)  目的:为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...

  8. [原创]java WEB学习笔记43:jstl 介绍,core库详解:表达式操作,流程控制,迭代操作,url操作

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. 刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决

    1. 表达式的种类 如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题,作为栈的应用事例,下面介绍表达式的求值过程. 任何一个表达式都是由操作数(亦称运算对象).操作符(亦称运算 ...

随机推荐

  1. Kibana创建索引成功,但一直不显示出来(Fielddata is disabled on text fields by default. Set fielddata=true........)

    现象 把EFK整个集群搭建完成后,通过Kibana操作界面创建索引(如图1),我创建了lile-zabbix*的索引,显示是创建成功了,但是只要我在重新刷新一次,已经创建的索引就“消失了”.后通过查看 ...

  2. Openlayers ol.interaction.Select取消默认选中效果

    说明: 在使用ol.interaction.Select进行点击查询时,默认会把点击选中的要素显示在地图上 我的需求是做轨迹回放,并可以点击轨迹上某一点,进行查询.这时候如果重新播放轨迹,会发现这个选 ...

  3. Python 中国大学排名定向爬虫

    代码来自于中国大学Mooc北京理工大学Pythont教学团队:https://www.icourse163.org/learn/BIT-1001870001#/learn/content?type=d ...

  4. db.properties(oracle)和(mysql)

    oracle jdbc.driver=oracle.jdbc.driver.OracleDriverjdbc.url=jdbc:oracle:thin:@localhost:1521:XEjdbc.u ...

  5. React躬行记(15)——React Hooks

    Hook(钩子)是React v16.8新引入的特性,能以钩子的形式为函数组件附加类组件的状态.生命周期等特性.React的类组件有难以拆分.测试,状态逻辑分散,难以复用等问题,虽然可以通过渲染属性( ...

  6. springboot2中使用dubbo的三重境界

    在springboot中使用dubbo,本来是件挺简单的事情,但现实的世界就是如此的复杂,今天我用一个亲身经历的跳坑和填坑的事来讲在spring boot中使用高版本dubbo(当当的魔改版)的三重境 ...

  7. CentOS 7上利用systemctl添加自定义系统服务

    Centos 7 之 systemctl CentOS 7继承了RHEL 7的新的特性,例如强大的systemctl,而systemctl的使用也使得以往系统服务的/etc/init.d的启动脚本的方 ...

  8. java this,super简单理解

    *****this****** 表示对当前对象的引用. 作用:1.区分实例变量和局部变量(this.name----->实例变量name) 2.将当前对象当做参数传递给其它对象和方法.利用thi ...

  9. python基本文件操作

    python文件操作 python的文件操作相对于java复杂的IO流简单了好多,只要关心文件的读和写就行了 基本的文件操作 要注意的是,当不存在某路径的文件时,w,a模式会自动新建此文件夹,当读模式 ...

  10. 简单实现TodoList

    Todolist实例 储备知识js的splice的用法 实例逻辑 1 在data里面做一个存一条条留言的列表,往里面添加或者删除留言内容. 2 做一个变量和input双向绑定,然后做一个点击事件把这个 ...