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. django classonlymethod 和 python classmethod的区别

    --classmethod可以被一个实例调用,classonlyethod只能被类调用 class Kls(object): no_inst = 0 def __init__(self): Kls.n ...

  2. hdu 6044 : Limited Permutation (2017 多校第一场 1012) 【输入挂 组合数学】

    题目链接 参考博客: http://blog.csdn.net/jinglinxiao/article/details/76165353 http://blog.csdn.net/qq_3175920 ...

  3. 对排序(Sort)的研究

    这一篇主要是介绍一些数据排序的基本算法和高级算法并利用JavaScript来逐一实现, 算法的说明: 稳定:如果a原本在b前面,当a=b时,排序之后a仍然在b的前面 不稳定:如果a原本在b的前面,当a ...

  4. python类对象属性查找原理

    class Foo(object): def __init__(self): # 这是一个对象属性 self.obj_pro = 12 # 这是一类属性 c_pro = 11 # 这是一个静态方法 @ ...

  5. php range()函数 语法

    php range()函数 语法 作用:创建一个包含指定范围的元素的数组.dd马达哪家好 语法:range(low,high,step) 参数: 参数 描述 low  必需.规定数组的最低值. hig ...

  6. 【进阶技术】一篇文章搞掂:Spring Cloud Stream

    本文总结自官方文档http://cloud.spring.io/spring-cloud-static/spring-cloud-stream/2.1.0.RC3/single/spring-clou ...

  7. SHADER 用 step替代 if-else

    今天聊起这个问题,百度发现了这个优化方式: https://blog.csdn.net/liu_if_else/article/details/77455639

  8. PHP常用工具函数之手机号相关

    1.手机号正确与否判定 //测试手机号 $phone = '17777777777'; $pattern = '/^1[356789]\d{9}$/'; $is = preg_match($patte ...

  9. 队列问题非STL解决方案

    队列问题非STL解决方案 常年使用STL解决队列问题,以至于严重生疏队列的根本原理... 直到今日 被老师被迫 使用算法原理解决问题,方才意识到我对队列一窍不通... ...直到 经过一系列的坑蒙拐骗 ...

  10. [COCI2017.1]Deda —— 解锁线段树的新玩法

    众所周知,能用线段树做的题一定可以暴力 但考场上也只能想到暴力了,毕竟还是对线段树不熟练. deda 描述 有一辆车上有n个小孩,年龄为1~n,然后q个询问,M X A代表在第X站时年龄为A的小孩会下 ...