Java8 Lambda表达式详解及实例_java

第一个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;

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, java8
lambda表达式
c lambda表达式详解、lambda表达式详解、java lambda表达式、java8 lambda表达式、java中lambda表达式,以便于您获取更多的相关知识。

时间: 2025-01-21 08:19:55

Java8 Lambda表达式详解及实例_java的相关文章

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

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

JAVA 内部类详解及实例_java

JAVA 内部类 一.什么是内部类? 一个类的定义放在另一个类的内部,这个类就叫做内部类 二.内部类有那些特性? 1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 . 2.内部类不能用普通的方式访问.内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 . 3.内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 . 三.内部类有哪几种? 1.成员内

Java 配置加载机制详解及实例_java

前言 现如今几乎大多数Java应用,例如我们耳熟能详的tomcat, struts2, netty-等等数都数不过来的软件,要满足通用性,都会提供配置文件供使用者定制功能. 甚至有一些例如Netty这样的网络框架,几乎完全就是由配置驱动,这样的软件我们也通常称之为"微内核架构"的软件.你把它配置成什么,它就是什么. It is what you configure it to be. 最常见的配置文件格式是XML, Properties等等文件. 本文探讨加载配置中最通用也是最常见的场

C++中的Lambda表达式详解_C 语言

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

java 重载(overload)与重写(override)详解及实例_java

 很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆.        先给出我的定义:     overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参数不同的方法组.本质是对不同方法的称呼.     override(覆写):存在继承关系的两个类之间,在子类中重新定义了父类中存在的方法.本质是针对同一个方法,给出不同的实现.  我们先来看重载的例子: public class OverloadParent{ public

UrlRewrite 重写url详解及实例_java

UrlRewrite 重写url详解 UrlRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址. urlrewrite顾名思义,就是对URL进行重写,用户得到的全部都是经过处理后的URL地址,这样做我觉得好处有三: 一:提高安全性,可以有效的避免一些参数名.ID等完全暴露在用户面前,如果用户随便乱输的话,不符合规则的话直接会返回个404或错误页面,这比直接返回500或一大堆服务器错误信息要好的多 二:美化URL,去除了那些比如*.do之类的后缀名.长长的参数串等,可

Android 混淆代码详解及实例

  Android 混淆代码详解及实例         为了防止自己的劳动成果被别人窃取,混淆代码能有效防止被反编译,下面来总结以下混淆代码的步骤: 1. 大家也许都注意到新建一个工程会看到项目下边有这样proguard-project.txt一个文件,这个对混淆代码很重要,如果你不小心删掉了,没关系,从其他地方拷贝一个过来 2. 最重要的就是在proguard-project.txt添加混淆的申明了: a. 把所有你的jar包都申明进来,例如: -libraryjars libs/apns_1

php array_values 返回数组的所有值详解及实例_php实例

php array_values php array_values 函数用于返回数组中所有的值,注意该函数将为新数组建立数组索引,原来的文字索引将不存在.本文章向大家讲解array_values函数的基本语法及使用实例. array_values 返回数组中所有的值 基本语法: array array_values ( array $input ) array_values() 返回 input 数组中所有的值并给其建立数字索引. 参数介绍: 参数 描述 input 必需.规定数组. 返回值:

thinkPHP中钩子的两种配置调用方法详解_php实例

本文实例讲述了thinkPHP中钩子的两种配置调用方法.分享给大家供大家参考,具体如下: thinkphp的钩子行为类是一个比较难以理解的问题,网上有很多写thinkphp钩子类的文章,我也是根据网上的文章来设置thinkphp的钩子行为的,但根据这些网上的文章,我在设置的过程中,尝试了十几次都没有成功,不过,我还是没有放弃,最后还是在一边调节细节,一边试验的过程中实现了钩子行为的设置.下面是我个人的设置经验,在这里跟大家分享一下. 个人做了两种设置,都试验成功了,一个简单点,在thinkphp