Java8新增的Lambda表达式

【特性】
支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。

【组成部分】
1,形参列表
形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号都可以省略。
2,箭头(->)
3,代码块
如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号。
Lambda代码块只有一条return语句,甚至可以省略return关键字。
Lambda表达式需要返回值,而它的代码块中仅有一条省略了return语句,Lambda表达式会自动返回这条语句的值。

【Lambda表达式的类型】
被称为“目标类型”(target type),Lambda表达式的目标类型必须是“函数式接口(functional interface)”。
Lambda表达式的结果被当成对象,即返回值是对象。

【函数式接口】
函数式接口代表只包含一个抽象方法的接口。
函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。

【Lambda表达式的限制】
1,Lambda表达式的目标类型必须是明确的函数式接口。
2,Lambda表达式只能为函数式接口创建对象。Lambda表达式只能实现一个方法,因此它只能为只有一个抽象方法的接口(函数式接口)创建对象。

【Lambda表达式常见使用方式】
1,将Lambda表达式赋值给函数式接口类型的变量。
2,将Lambda表达式作为函数式接口类型的参数传给某个方法。
3,使用函数式接口对Lambda表达式进行强制类型转换。

【Lambda表达式的本质】
使用简洁的语法来创建函数式接口的实例——这种语法避免了匿名内部类的烦琐。

【方法引用与构造器引用】
1,引用类方法
  类名::类方法
    Converter converter1 = Integer::valueOf;
  (a,b...) -> 类名.类方法(a,b...)
    Converter converter1 = from -> Integer.valueOf(from);
2,引用特定对象的实例方法
  特定对象::实例方法
    Converter converter2 = "fkit.org"::indexOf;
  (a,b...) -> 特定对象.实例方法(a,b...)
    Converter converter2 = from -> "fkit.org".indexOf(from);
3,引用某类对象的实例方法
  类名::实例方法
    MyTest mt = String::substring;
  (a,b...) -> a.实例方法(b...)
    MyTest mt = (a,b,c) -> a.substring(b,c);
4,引用构造器
  类名::new
    YourTest yt = JFrame::new;
  (a,b...) -> new 类名(a,b...)
    YourTest yt = (String a) -> new JFrame(a);

【Lambda表达式与匿名内部类的联系和区别】
相同:
1,Lambda表达式与匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部类的成员变量(包括实例变量和类变量)。
2,Lambda表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法。
区别:
1,匿名内部类可以为任意接口创建实例——不管接口包含多少个抽象方法,只要匿名内部类实现所有的抽象方法即可;
     但Lambda表达式只能为函数式接口创建实例。
2,匿名内部类可以为抽象类甚至普通类创建实例;
     但Lambda表达式只能为函数式接口创建实例。
3,匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法;
     但Lambda表达式的代码块不允许调用接口中定义的默认方法。

【示例1】
class Demo
{
  //该方法调用需要Eaterble对象
  public void eat(Eatable e) {
    System.out.println(e);
    e.taste();
  }

  //调用该方法需要Flyable对象
  public void drive(Flyable f) {
    System.out.println("我正在驾驶:" + f);
    f.fly("【碧空如洗的晴日】");
  }

  //调用该方法需要Addable对象
  public void test(Addable add) {
    System.out.println("5与3的和为:" + add.add(5,3));
  }

  public static void main(String[] args) {
    Demo d = new Demo();

    d.eat(()->System.out.println("苹果的味道不错!"));

    d.drive(weather->
    {
      System.out.println("今天的天气是:" + weather);
      System.out.println("直升机飞行平稳");
    });

    d.test((a,b)->a+b);

  }
}

interface Eatable
{
  void taste();
}

interface Flyable
{
  void fly(String weather);
}

interface Addable
{
  int add(int a, int b);
}

结果:
Demo$$Lambda$1/0x0000000100061040@2a098129
苹果的味道不错!
我正在驾驶:Demo$$Lambda$2/0x0000000100067840@6956de9
今天的天气是:【碧空如洗的晴日】
直升机飞行平稳
5与3的和为:8

【示例2】
import java.util.Arrays;

class Demo
{
  public static void main(String[] args) {
    String[] arr1 = new String[]{"java","fkava","fkit","ios","android"};
    Arrays.parallelSort(arr1,(o1,o2) -> o1.length() - o2.length());
    System.out.println(Arrays.toString(arr1));
    int[] arr2 = new int[]{3,-4,25,16,30,18};
    Arrays.parallelPrefix(arr2, (left,right) -> left*right);
    System.out.println(Arrays.toString(arr2));
    long[] arr3 = new long[5];
    Arrays.parallelSetAll(arr3, operand -> operand*5);
    System.out.println(Arrays.toString(arr3));
  }
}

结果:
[ios, java, fkit, fkava, adnroid]
[3, -12, -300, -4800, -144000, -2592000]
[0, 5, 10, 15, 20]

Java疯狂讲义笔记——Lambda表达式的更多相关文章

  1. Java疯狂讲义笔记——枚举类

    枚举类 ——Java5[基础知识]1,定义枚举类——关键字 enum (地位与class.interface相同).2,枚举类是一个特殊的类,可以有成员变量.方法,实现一个或多个接口,定义自己的构造器 ...

  2. Java疯狂讲义笔记——内部类

    [定义]内部类:定义在其它类内部的类.外部类:包含内部类的类,也称 宿主类.局部内部类:定义在方法里的内部类. [接口内部类]接口中也可以定义内部类,必须为public static修饰(自动添加), ...

  3. 参考《Java疯狂讲义》

    参考<Java疯狂讲义>Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例 1. Lambda ...

  4. java8--类加载机制与反射(java疯狂讲义3复习笔记)

    本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...

  5. Java8学习笔记----Lambda表达式 (转)

    Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家       本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...

  6. Java函数式编程和lambda表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

  7. Java核心技术-接口、lambda表达式与内部类

    本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...

  8. Java基础教程:Lambda表达式

    Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...

  9. java函数式编程之lambda表达式

    作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...

随机推荐

  1. win cmd执行Python脚本提示找不到模块问题

    Windows关于命令行执行Python脚本,提示找不到模块的问题,我 本人也是在pycharm上运行没毛病的,后来在本地搞了个Jenkins做定时任务,谁知道就提示找不到模块 也百度了很多,都是说什 ...

  2. Test 3.27 T3 矩阵

    Description 给一个 n*n 的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入 k n(n<2000)和一个 n*n 的地图 Output 输 ...

  3. CSS中属性百分比的基准点

    1.属性百分比的基准点 1.1.基于包含块 以下的关于包含块(含块)的概念,不能简单地理解成是父元素. 如果是静态定位和相对定位,包含块一般就是其父元素.但是对于绝对定位的元素,包含块应该是离它最近的 ...

  4. php大文件断点续传

    该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开始. 如何分 ...

  5. Web截屏插件

    官方网站:http://www.ncmem.com 官方博客:http://www.cnblogs.com/xproer 产品首页:http://www.ncmem.com/webplug/scppr ...

  6. 查看window系统有哪些服务

    右键点击开始菜单按钮,选择“运行”(也可以快捷键 WIN+R 打开) 在运行框中输入命令services.msc打开服务窗口 在服务窗口列出了系统的所有服务,有运行的,也有停止的,可以点击“状态”列对 ...

  7. 【转】Django-template模板语言

    Django-template模板语言 转自:https://www.cnblogs.com/zzy-9318/p/8672945.html 一.常用语法 只需要记两种特殊符号: {{  }}和 {% ...

  8. python发送消息到ipmsg

    from socket import * #利用socket模块生成套接字s = socket(AF_INET,SOCK_DGRAM) #定义一个元组,包含ip地址,和端口号,ip地址必须为字符串,端 ...

  9. 如何创建自定义的Resource实例

    由Resource的构造函数Resources(AssetManager assets, DisplayMetrics metrics, Configuration config)了解到,需要获取ap ...

  10. machine learning 之 Recommender Systems

    整理自Andrew Ng的machine learning 课程 week 9. 目录: Problem Formulation(问题的形式) Content Based Recommendation ...