Java8深入学习系列(一)λ表达式介绍

  

  

最近在学习java8,所以接下来会给大家介绍一系列的java8学习内容,那么让我们先从λ表达式开始。

  

众所周知从java8出现以来λ是最重要的特性之一,它可以让我们用简洁流畅的代码完成一个功能。很长一段时间java被吐槽是冗余和缺乏函数式编程能力的语言,随着函数式编程的流行java8种也引入了这种编程风格。在此之前我们都在写匿名内部类干这些事,但有时候这不是好的做法,本文中将介绍和使用λ,带你体验函数式编程的魔力。

  

 Java8深入学习系列(一)λ表达式介绍”> <br/>
  </p>
  <p> </p>
  <p>λ表达式是一段可以传递的代码,它的核心思想是将面向对象中的传递数据变成传递行为。我们回顾一下在使用java8之前要做的事,之前我们编写一个线程时是这样的:</p>
  
  <pre类=   可运行r=新Runnable () {   @Override   公共空间run () {   system . out。println(“做点什么。”);   }   }      

也有人会写一个类去实现运行的接口,这样做没有问题,我们注意这个接口中只有一个运行方法,当把Runnable对象给线程对象作为构造参数时创建一个线程,运行后将输出<代码>做点什么。>   

这实际上是一个代码即数据的例子,在运行方法中是线程要执行的一个任务,但上面的代码中任务内容已经被规定死了。当我们有多个不同的任务时,需要重复编写如上代码。
  

  

设计匿名内部类的目的,就是为了方便Java程序员将代码作为数据传递,不过,匿名内部类还是不够简便,为了执行一个简单的任务逻辑,不得不加上6行冗繁的样板代码。那如果是λ该怎么做& # 63;

        可运行r=()→system . out。println(“做点什么。”);      

嗯,这代码看起来很酷,你可以看到我们用()和→的方式完成了这件事,这是一个没有名字的函数,也没有人和参数,再简单不过了。使用→将参数和实现逻辑分离,当运行这个线程的时候执行的是→之后的代码片段,且编译器帮助我们做了类型推导,这个代码片段可以是用{}包含的一段逻辑。下面一起来学习一下λ的语法。

  

  

在λ中我们遵循如下的表达式来编写:

        表达=(变量)→行动      
      <李>变量:这是一个变量,一个占位符。像x, y, z,可以是多个变量。   <李>行动:这里我称它为行动,这是我们实现的代码逻辑部分,它可以是一行代码也可以是一个代码片段李   
  Java中λ

可以看到表达式的格式:参数,箭头,以及动作实现,当一个动作实现无法用一行代码完成,可以编写一段代码用{}包裹起来。

  

<强>λ表达式可以包含多个参数,例如:

        int金额=(x, y)→x + y;      

这时候我们应该思考这段代码不是之前的x和y数字相加,而是创建了一个函数,用来计算两个操作数的和。后面用int类型进行接收,在λ中为我们省略去了回来。

  

  

函数式接口是只有一个方法的接口,用作λ表达式的类型。前面写的例子就是一个函数式接口,来看看jdk中的Runnable源码

        @FunctionalInterface   公共接口可运行{/* *   *当一个对象实现的接口& lt; code> Runnable使用   *创建一个线程,线程对象的原因   * & lt; code> run</code>将被调用的方法分别执行   *线程。   * & lt; p>   *方法的总承包合同& lt; code> run是,它可能   *采取任何行动。   *   * @see java.lang.Thread # run ()   */公共抽象空运行();   }      

这里只有一个抽象方法,实际上你不写<代码> <你>公共抽象 也是可以的,在接口中定义的方法都是公共抽象的。同时也使用注解<代码> @FunctionalInterface 告诉编译器这是一个函数式接口,当然你不这么写也可以,标识后明确了这个函数中只有一个抽象方法,当你尝试在接口中编写多个方法的时候编译器将不允许这么干。

  

  

我们来编写一个函数式接口,输入一个年龄,判断这个人是否是成人。

        公开课FunctionInterfaceDemo {   @FunctionalInterface   接口Predicate

Java8深入学习系列(一)λ表达式介绍