欢迎光临北大青鸟华大软件校区

我的位置: 首页 >>Java Lambda 表达式学习笔记

Java Lambda 表达式学习笔记

2017-06-14

来源:

  JavaLambda表达式学习笔记

  JavaLambda表达式是Java8引入的一个新的功能,可以说是模拟函数式编程的一个语法糖,类似于Javascript中的闭包,但又有些不同,主要目的是提供一个函数化的语法来简化我们的编码。

  Lambda基本语法

  Lambda的基本结构为(arguments)->body,有如下几种情况:

  参数类型可推导时,不需要指定类型,如(a)->System.out.println(a)

  当只有一个参数且类型可推导时,不强制写(),如a->System.out.println(a)

  参数指定类型时,必须有括号,如(inta)->System.out.println(a)

  参数可以为空,如()->System.out.println(“hello”)

  body需要用{}包含语句,当只有一条语句时{}可省略

  常见的写法如下:

  (a)->a*a

  (inta,intb)->a+b

  (a,b)->{returna-b;}

  ()->System.out.println(Thread.currentThread().getId())

  函数式接口FunctionalInterface

  概念

  JavaLambda表达式以函数式接口为基础。什么是函数式接口(FunctionalInterface)?简单说来就是只有一个方法(函数)的接口,这类接口的目的是为了一个单一的操作,也就相当于一个单一的函数了。常见的接口如:Runnable,Comparator都是函数式接口,并且都标注了注解@FunctionalInterface。

  举例

  以Thread为例说明很容易理解。Runnable接口是我们线程编程时常用的一个接口,就包含一个方法voidrun(),这个方法就是线程的运行逻辑。按照以前的语法,我们新建线程一般要用到Runnable的匿名类,如下:

  newThread(newRunnable(){

  @Override

  publicvoidrun(){

  System.out.println(Thread.currentThread().getId());

  }

  }).start();

  如果写多了,是不是很无聊,而基于Lambda的写法则变得简洁明了,如下:

  newThread(()->System.out.println(Thread.currentThread().getId())).start();

  注意Thread的参数,Runnable的匿名实现就通过一句就实现了出来,写成下面的更好理解

  Runnabler=()->System.out.println(Thread.currentThread().getId());

  newThread(r).start();

  当然Lambda的目的不仅仅是写起来简洁,更高层次的目的等体会到了再总结。

  再看一个比较器的例子,按照传统的写法,如下:

  Integer[]a={1,8,3,9,2,0,5};

  Arrays.sort(a,newComparator(){

  @Override

  publicintcompare(Integero1,Integero2){

  returno1-o2;

  }

  });

  Lambda表达式写法如下:

  Integer[]a={1,8,3,9,2,0,5};

  Arrays.sort(a,(o1,o2)->o1-o2);

  JDK中的函数式接口

  为了现有的类库能够直接使用Lambda表达式,Java8以前存在一些接口已经被标注为函数式接口的:

  java.lang.Runnable

  java.util.Comparator

  java.util.concurrent.Callable

  java.io.FileFilter

  java.security.PrivilegedAction

  java.beans.PropertyChangeListener

  Java8中更是新增加了一个包java.util.function,带来了常用的函数式接口:

  Function-函数:输入T输出R

  BiFunction-函数:输入T和U输出R对象

  Predicate-断言/判断:输入T输出boolean

  BiPredicate-断言/判断:输入T和U输出boolean

  Supplier-生产者:无输入,输出T

  Consumer-消费者:输入T,无输出

  BiConsumer-消费者:输入T和U无输出

  UnaryOperator-单元运算:输入T输出T

  BinaryOperator-二元运算:输入T和T输出T

  另外还对基本类型的处理增加了更加具体的函数是接口,包括:BooleanSupplier,DoubleBinaryOperator,DoubleConsumer,DoubleFunction,DoublePredicate,DoubleSupplier,DoubleToIntFunction,DoubleToLongFunction,DoubleUnaryOperator,IntBinaryOperator,IntConsumer,IntFunction,IntPredicate,IntSupplier,IntToDoubleFunction,IntToLongFunction,IntUnaryOperator,LongBinaryOperator,LongConsumer,LongFunction,LongPredicate,LongSupplier,LongToDoubleFunction,LongToIntFunction,LongUnaryOperator,ToDoubleBiFunction,ToDoubleFunction,ToIntBiFunction,ToIntFunction,ToLongBiFunction,ToLongFunction。结合上面的函数式接口,对这些基本类型的函数式接口通过类名就能一眼看出接口的作用。

  创建函数式接口

  有时候我们需要自己

相关热词搜索:北大青鸟北大青鸟

开班信息

开班课程 人数 了解详情
名企定向委培班 剩余名额3 课程介绍
ACCP8.0软件培训班 剩余名额8 课程介绍
短期冲刺班 剩余名额2 课程介绍
项目精英班 剩余名额1 课程介绍
NET课程重点班 剩余名额6 课程介绍
软件开发精英班 剩余名额2 课程介绍
JAVA特招班 剩余名额10 课程介绍

免费试听

试听课程 了解详情
名企定向委培班 试听详情
ACCP8.0软件培训班 试听详情
短期冲刺班 试听详情
项目精英班 试听详情
NET课程重点班 试听详情
软件开发精英班 试听详情
JAVA特招班 试听详情

姓名:

电话:

最新就业

姓名 就业岗位 就业企业
何伟煊 java工程师 金政信息科技
张雅涵 NET工程师 国贸集团股份有限公司
张默 项目组长 极宇舟天有限公司
张婧涵 NET工程师 大族激光有限公司
张洪文 运维工程师 诚迈科技有限公司
王玥婷 java技术顾问岗位 百纳威尔有限公司
王鸿轩 Java开发岗位 爱卡智能
邓安志 软件开发工程师 美的集团
何浚宏 软件开发课程工程师 东和科技有限公司
黄隆 软件开发顾问 建发股份公司
刘应琴 软件开发工程师 国美集团
刘雨林 java工程师 唯品会科技有限公司
彭子昂 Java开发 爱卡智能有限公司

华大校区地址:佛山市禅城区佛山大道北143号

电话:400-966-9387? ?0757-88726000

  • 备案号:粤ICP备18001900号
  • 版权所有:bt365体育投注网_365体育投注娱乐场送彩金_365体育投注存钱收不到邮件

北大青鸟华大软件校区

?未标题-1