Java8 Lambda表达式详解及实例

第一个Lambda表达式

在Lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式:

Runnable runnable = new Runnable() {
      @Override
      public void run() {
        System.out.println("Hello runnable");
      }
    };
    ...
 thread.start();

上面的例子如果改成使用Lambda就会简单许多:

Runnable noArgs = ()->System.out.println("Hello Lambda!~");
...
 thread.start();

Lambda表达式是一个匿名函数,将行为像数据一样传递,表达式使用 -> 将参数和主体分开, -> 前面是参数部分,后面这是主体部分。

Lambda的其它形式

BinaryOperator<Long> add = (x,y)->x+y;
 //OR
 BinaryOperator<Long> add = (Long x,Long y)->x+y;
 //OR
 BinaryOperator<Long> add = (Long x,Long y)->{
  x+y;
 };
  1. Lambda表达式使用 () 表示没有参数。
  2. 如果Lambda表达式中只包含一个参数,可省略掉 () 。
  3. 如果Lambda表达式的主题是一段代码块,需要使用 {} ,该代码块与普通的Java代码块并无区别,也可以返回或抛出异常。
  4. 如果参数的类型可以由编译器推断得出可以省略参数类型,当然你也可以加上。

以上就是Lambda表达式的所有形式了。

那么问题来了:

BinaryOperator<Long> add = (Long x,Long y)->x+y; 是个什么意思?

这行代码并不是讲个数字相加,而是创建了一个函数,用来计算两个数字相加的结果。而add的类型是 BinaryOperator<Long> ,它也不是两个数字的和,而是将两个数字相加的那段代码。下面的例子展示如何使用这个变量:

BinaryOperator<Long> add = (Long x,Long y)->x+y;
 Long res = add.apply(3L, 4L);
 System.out.println("res="+res);//输出:res=7

函数接口

函数接口是只有一个抽象方法的接口,用作Lambda表达式的类型。

如 Runnable 就是一个函数接口。

新建一个我们自己的函数接口:

public interface AddOperator<T,D> {
  long add(T one,D two);
}

使用:

AddOperator<Long,Long> addOperator = ( x, y)->x +y;
 System.err.println("Custom function listener res= "+addOperator.add(34L, 65L));

目标类型

目标类型是指Lambda表达式所在上下文环境的类型。比如,将Lambda表达式赋值给一个局部变量,或传递给一个方法作为参数,局部变量或方法参数的类型就是Lambda表达式的目标类型。

final

如果我们在匿名内部类中引用了所在方法中的局部变量,这是需要局部变量是 final 的。

在Lambda中我们不需要将引用的外部局部变量声明为 final 的,但是该变量只能被赋值一次。

下面的例子中如果我们去掉注释,对name再次赋值,则无法通过编译,并显示出错信息: local variables referenced from a Lambda expression must be final or effectively final.

Lambda表达式引用的局部变量必须是final或即成事实的final。

String name = getUserName();
//name="hi";
button.addActionListener(event->System.out.println("name="+name));

类型推断

Lambda表达式的类型推断是Java7中就引入的目标类型推断的扩展。

java7中的类型推断:

List<String> list= new ArrayList<>();

上例中我们并没有指定ArrayList的范型类型,而是根据list的类型,推断出了ArrayList的范性类型。

如: AddOperator<Long,Long> addOperator = ( x, y)->x +y;

通过此文,希望能帮助到大家,学习理解,此部分知识,谢谢大家对本站的支持!

(0)

相关推荐

  • Java8使用lambda实现Java的尾递归

    前言 本篇介绍的不是什么新知识,而是对前面讲解的一些知识的综合运用.众所周知,递归是解决复杂问题的一个很有效的方式,也是函数式语言的核心,在一些函数式语言中,是没有迭代与while这种概念的,因为此类的循环通通可以用递归来实现,这类语言的编译器都对递归的尾递归形式进行了优化,而Java的编译器并没有这样的优化,本篇就要完成这样一个对于尾递归的优化. 什么是尾递归 本篇将使用递归中最简单的阶乘计算来作为例子 递归实现 /** * 阶乘计算 -- 递归解决 * * @param number 当前阶

  • Java8中的 Lambda表达式教程

     1. 什么是λ表达式 λ表达式本质上是一个匿名方法.让我们来看下面这个例子: public int add(int x, int y) { return x + y; } 转成λ表达式后是这个样子: (int x, int y) -> x + y; 参数类型也可以省略,Java编译器会根据上下文推断出来: (x, y) -> x + y; //返回两数之和 或者 (x, y) -> { return x + y; } //显式指明返回值 可见λ表达式有三部分组成:参数列表,箭头(-&g

  • Java8中lambda表达式的应用及一些泛型相关知识

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public class Employee { public String name; public int age; public char sex; public String time; public int salary; } 我们有一列此类数据 List<Employee> data = Arrays.asL

  • Java8新特性之Lambda表达式浅析

    说到java 8,首先会想到lambda(闭包)以及虚拟扩展方法(default method),这个特性早已经被各大技术网站炒得沸沸扬扬了,也是我们java 8系列开篇要讲的第一特性(JEP126 http://openjdk.java.net/jeps/126),jdk8的一些库已经应用了lambda表达式重新设计了,理解他对学习java 8新特性有着重要的意义. 一.函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是

  • Java8 新特性Lambda表达式实例详解

    Java8 新特性Lambda表达式实例详解 在介绍Lambda表达式之前,我们先来看只有单个方法的Interface(通常我们称之为回调接口): public interface OnClickListener { void onClick(View v); } 我们是这样使用它的: button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { v.setText("

  • Java8新特性lambda表达式有什么用(用法实例)

    我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值.现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析Java集合里面的批量数据操作(bulk operation),解开lambda最强作用的神秘面纱. 1.关于JSR335 JSR是Java Specification Requests的缩写,意思是Java 规范请求,Java 8 版本的主要改进是 Lambda 项目(JSR 335),其

  • Java8 Lambda表达式详解及实例

    第一个Lambda表达式 在Lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式: Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello runnable"); } }; ... thread.start(); 上面的例子如果改成使用Lambda就会简单许多: Runnable noArgs = ()->System.out.print

  • Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块). Lambda表达式还增强了集合库. Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及 java.util.stream 包. 流(stream)就如同迭代器(iterator),但附加了许多额外的功能.

  • C++函数对象Functor与匿名函数对象Lambda表达式详解

    目录 1函数对象Functor(仿函数) 1.1概念 1.2代码实例 1.3调用效率 2.匿名函数对象Lambda表达式 2.1使用形式 2.2代码实例 3总结 1函数对象Functor(仿函数) 1.1概念 函数对象就是类对象,生成这个类对象的类中,拥有一个小括号运算符重载函数. 重载了小括号运算符的类的类对象,就叫函数对象. 1.2代码实例 #include <iostream> using namespace std; template <class T1> class A

  • python3 lambda表达式详解

    技术背景 lambda表达式本身是一个非常基础的python函数语法,其基本功能跟使用def所定义的python函数是一样的,只是lambda表达式基本在一行以内就完整的表达了整个函数的运算逻辑.这里我们简单展示一些lambda表达式的使用示例,以供参考. 二元求和 首先我们尝试一个最简单的二元求和的ipython案例,输入两个参数x和y,返回这两个元素的和: [dechin@dechin-manjaro 2021-python]$ ipython Python 3.8.5 (default,

  • C++ Boost Lambda表达式详解

    目录 lambda表达式格式 说明Boost.Lambda lambda表达式格式 lambda表达式的格式 [捕捉列表](参数列表)mutable->返回值类型{ 语句部分 }; 其中参数列表.返回值类型是可选的,捕捉列表.函数体可以为空. 先来看一个较为简单的lamda表达式 int main(void) { auto add = [](int a, int b)->int {return a + b; }; cout << add(1, 2) << endl; r

  • Java Lambda 表达式详解及示例代码

    Java Lambda 表达式是 Java 8 引入的一个新的功能,可以说是模拟函数式编程的一个语法糖,类似于 Javascript 中的闭包,但又有些不同,主要目的是提供一个函数化的语法来简化我们的编码. Lambda 基本语法 Lambda 的基本结构为 (arguments) -> body,有如下几种情况: 参数类型可推导时,不需要指定类型,如 (a) -> System.out.println(a) 当只有一个参数且类型可推导时,不强制写 (), 如 a -> System.o

  • Java8 lambda表达式的10个实例讲解

    目录 例1.用lambda表达式实现Runnable 例2.使用Java 8 lambda表达式进行事件处理 例3.使用lambda表达式对列表进行迭代 例4.使用lambda表达式和函数式接口Predicate 例5.如何在lambda表达式中加入Predicate 例6.Java 8中使用lambda表达式的Map和Reduce示例 例7.通过过滤创建一个String列表 例8.对列表的每个元素应用函数 例9.复制不同的值,创建一个子列表 例10.计算集合元素的最大值.最小值.总和以及平均值

  • C#匿名委托与Lambda表达式详解

    通过使用匿名委托(匿名方法),使编程变得更加灵活,有关委托与匿名委托请参考我的前一篇Blog<委托与匿名委托>. 继续之前示例,代码如下: static void Main(string[] args) { Worker.TwoNumberHandleMethodDelegate method = delegate(int a, int b) { return a + b; }; Worker worker = new Worker(); int result = worker.HandleT

  • C++中的Lambda表达式详解

    我是搞C++的 一直都在提醒自己,我是搞C++的:但是当C++11出来这么长时间了,我却没有跟着队伍走,发现很对不起自己的身份,也还好,发现自己也有段时间没有写C++代码了.今天看到了C++中的Lambda表达式,虽然用过C#的,但是C++的,一直没有用,也不知道怎么用,就可怜的连Lambda语法都看不懂.好了,这里就对C++中的Lambda进行一个简单的总结,就算是对自己的一个交代,我是搞C++的,我是一个C++ programmer. 一段简单的Code 我也不是文艺的人,对于Lambda的

  • C#3.0中Lambda表达式详解

    在C#2.0中,微软给我们带来了一些新的特性,例如泛型,匿名委托等.然而,这些新的特性多多少少会给人一种从别的语言中"抄"来的感觉(例如泛型类似C++的模板,一些特性类似Java中的一些东西).但是在C#3.0中,微软给我带来的一些新特性可能是以前所有开发语言都没有的特性.这无疑大大的体现了C#3.0在开发语言中强大的优势. Lambda表达式 Lambda 表达式是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型.所有 Lambda 表达式都使用 Lambd

随机推荐