zoukankan      html  css  js  c++  java
  • Lambda表达式

    Lambda表达式

    函数式编程思想概述

    y=x+1;再数学中,函数就是有输入量,输出量的一套计算方案;也就是''拿什么东西,做什么事情''.相对而言,面向对象过程中过分强调必须通过对象的方式,而函数式编程思想则尽量忽略面向对象的复杂语法--强调做什么,而不是以什么方式来做.

    面向对象的思想:

    做一件事情,找一个能解决问题的对象,调用对象的方法来完成事情.

    函数式编程的思想:

    只要能获得这个事情的结果,谁去做的,怎么做的都不重要,重视的是结果,不重视过程.

    冗余的Runnable代码

    当需要启动一个线程去完成一项任务时,通常会通过Runnable接口来定义任务内容,并且使用Thread类来启动线程.

    代码如下:

    new Thread(new Runnable() {
    public void run() {
    System.out.println(Thread.currentThread().getName()+"新线程被创建了");
    }
    }).start();
                                         ||
    new Thread(()->System.out.println(Thread.currentThread().getName()+"新线程被创建了")).start();

     

    代码分析

    对于Runnable的匿名内部类用法,可以分析出以下内容:

    • Thread类需要Runnable接口作为参数,其中的抽象方法run用来指定线程任务内容的核心.

    • 为了制定run方法的方法体,不得不需要Runnable接口的实现类

    • 为了省去定义一个RunnableImpl实现类的麻烦,不得不使用匿名内部类.

    • 必须重写抽象方法run方法,所以方法的名称.方法的参数.方法的返回值.不得不在写一遍,且不能写错.

    • 只有方法体才是线程任务的关键性内容

    编程思想的转换

    做什么,而不是怎么做

    我们真正希望做的事情是:将run方法体内的代码传递给Thread类知晓能够加载到即可.

    传递一段代码---这是我们真正的目的.

    我们需要将程序开发的重点从怎么做*回归到做什么的本质上,过程与形式并不重要.

    2014年3月Oracke官方所发布的java 8(JDK1.8)中,加入了Lambda表达式

    体验Lambda表达式的更优写法

    java 8的新特性,优化刚才的代码

     
    public class Demo01Runnable{
           public static void main(String [] args){
            //使用Lambda表达式的方式
               new Thread(()->{
                       System.out.println("开启了一个新的线程任务");
              }).start();//启动新线程
          }  
    }

    从上面的代码可以看出:没有创建接口实现类对象,不再有抽象方法的覆盖重写的操作,只写了线程任务的内容.

    从上面的代码能够退出Lambda的语法:

    ()-> System.out.println("开启了一个新的线程任务");
    • 前面的一对小括号即run方法,参数为无,里面是空的,此时不需要任何的条件

    • 中间的一个箭头代表将前面的参数传递给后面的代码

    • 后面的输出语句即业务逻辑代码(线程任务内容)

    Lambda的标准格式

    • 一些参数

    • 一个箭头

    • 一段代码

    Lambda表达式的标准格式:

    (参数类型1 参数名称1,参数类型2 参数名称2 ....)->{代码语句}

    格式说明:

    • 小括号内的语法与传统的方法参数列表一致,无参数就留空,多个参数则用逗号隔开

    • ->是新引入的语法格式,代表指向的动作

    • 大括号内的语法与传统方法体要求基本一致.

    Lambda省略格式

    可推到即可省略

    Lambda强调的是"做什么",而不是"怎么做",所以凡是可以根据上下文推导得知的信息,都可以省略.比如:

    invokeSum(3.14,3.15,(double d1,double d2)->{
       return d1+d2;
    })
       //省略格式表达
       invokeSum(3.14,3.15(d1,d2)-> d1+d2);

    省略的规则:

    在Lambda标准格式的表达式的基础上,使用省略写法的规则是:

    1.小括号内参数的类型可以省略

    2.如果小括号内有且仅有一个参数,则小螺号也可省略

    3.如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号,return关键字和语句的分号.

    Lambda的使用前提

    Lambda的语法非常的简洁,使用非常的简单,但是有以下注意事项:

    1.使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法.

    无论JDK内置的Runnable.Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一,才可以使用Lambda

    2.使用Lambda必须具有上下文推断

    也就是方法的参数或者局部变量类型必须为Lambda对象的接口类型,才能使用Lambda作为该接口的实例.

    备注:有且仅有一个抽象方法的接口,称为函数式接口

  • 相关阅读:
    正则表达式(十四)——找出某一个网页内部的所有的邮箱
    正则表达式(十三)——分组
    正则表达式(十二)——字符串的替换
    正则表达式(十一)——find和lookingAt
    查看隐藏文件夹
    SpringBoot 热部署
    oracle dmp文件泵导入
    python -爬虫-pycrul安装问题
    阿里云https tomcat配置
    jar包下载
  • 原文地址:https://www.cnblogs.com/rosiness/p/14152558.html
Copyright © 2011-2022 走看看