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. HashMap底层代码分析

    public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; //this.loadFactor为加载因子,其值为默认的加载因子常量:DEFAUL ...

  2. 记录一下LEETheme库主题切换的使用

    LEETheme库的位置:https://github.com/lixiang1994/LEETheme 从https://github.com/gsdios的SDAutolayoutDemo 中的白 ...

  3. Codeforces 850A - Five Dimensional Points(暴力)

    原题链接:http://codeforces.com/problemset/problem/850/A 题意:有n个五维空间内的点,如果其中三个点A,B,C,向量AB,AC的夹角不大于90°,则点A是 ...

  4. UVA 1045 最长公共子序列

    题目描述:求最长公共子序列 若给定序列X={x1,x2,...,xm},另一序列Z={z1,z2,...,zk},是X的子序列是指存在一个严格递增的下标序列{i1,i2,...,ik}使得对所以j=1 ...

  5. loj#2391 「JOISC 2017 Day 1」港口设施

    分析 https://yhx-12243.github.io/OI-transit/records/uoj356%3Bloj2391%3Bac2534.html 代码 #include<bits ...

  6. 【CDN+】Kafka 的初步认识与入门

    前言 项目中用到了Kafka 这种分布式消息队列来处理日志,本文将对Kafka的基本概念和原理做一些简要阐释 Kafka 的基本概念 官网解释: Kafka是最初由Linkedin公司开发,是一个分布 ...

  7. windows 命令端口映射

    显示映射列表netsh interface portproxy show all 将本地的1234端口的数据转发至192.168.x.x上的1234端口netsh interface portprox ...

  8. 《图解设计模式》读书笔记2-1 Template Method模式

    目录 模板方法模式 类图 思想: 模板方法模式 在父类中定义流程,在子类中实现具体的方法. 类图 代码 //抽象类 public abstract class AbstractDisplay { pu ...

  9. 使用Xmanager远程CentOS 7服务器(XDMCP)

    0. 前言 基本概念 简略概述 Display Manager 提供登录需求 在文字界面下可以通过startx来启动Xwindows 在runlevel 5下,在tty7处有可以使用的图形登录界面(方 ...

  10. eval方法遇到的问题

    工作中有这样的场景,一个表达式比如 2*2,计算结果是number,这样的为true,如果输入错误 2*@,这样的情况需要匹配为false. 这里使用的eval方法, type of (eval('2 ...