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 修改字段后,同步数据库,失败:django.db.utils.InternalError: (1054, "Unknown column 'api_config.project_id_id' in 'field list'")

    问题原因是,修改字段后,同步失败了,然后执行查询的时候,就会提示这个错误,这个字段没有 最暴力的方法可以直接在数据库中修改字段,但是修改后,models没同步,可能会存在问题,因此开始我的百度之旅(这 ...

  2. Task2.特征提取

    参考:https://blog.csdn.net/u012052268/article/details/77825981/ 利用jieba分词工具去除停用词: 停用词:1.在SEO中为节省空间和提高搜 ...

  3. POJ 2391--Ombrophobic Bovines(最大流(拆点)+二分+最短路)

    Ombrophobic Bovines Description FJ's cows really hate getting wet so much that the mere thought of g ...

  4. 【LOMBOK】能引入 @Slf4j 注解,不能识别 log 的解决方法

    问题: 在pom.xml中加入引入了lombok的依赖,可以引用@Slf4j注解不能识别log 如:注:上面一篇博客,已经说明lombok的安装了,但是用的时候还有点问题. 1).把lombok.ja ...

  5. Nginx的启动、停止与重启---linux

    一.选定安装文件目录 可以选择任何目录 cd /usr/local/src 二.安装PCRE库 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcr ...

  6. c#image与byte数组的转换

    // image to byte[] Image photo = new Bitmap(selectPictureFile); System.IO.MemoryStream ms = new Syst ...

  7. C语言 | 线段树

    #include<stdio.h> #define MAX_LEN 1000 void build_tree(int arr[],int tree[],int node,int start ...

  8. NOIp 数学知识点总结

    推荐阅读 NOIp 基础数论知识点总结: https://www.cnblogs.com/greyqz/p/number.html 排列组合 常用公式 排列:\[\displaystyle A_n^m ...

  9. [CSP-S模拟测试]:折纸(模拟)

    题目描述 小$s$很喜欢折纸.有一天,他得到了一条很长的纸带,他把它从左向右均匀划分为$N$个单位长度,并且在每份的边界处分别标上数字$0\sim n$.然后小$s$开始无聊的折纸,每次他都会选择一个 ...

  10. 笨办法学Python(learn python the hard way)--练习程序1-10

    下面是当初看这本书时按照书中的代码做的练习,一行一行敲下来的,都已经试运行过,没有错误(基于python3),练习1-练习10 #ex1.py 1 #print("Hello world!& ...