Java8 Lambda表达式详解及实例

 更新时间:2016年09月26日 10:35:22   投稿:lqh  
这篇文章主要介绍了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;

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

相关文章

  • SpringMVC中的@RequestMapping注解的使用详细教程

    SpringMVC中的@RequestMapping注解的使用详细教程

    @RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系,本文主要来和大家详细讲讲它的具体使用,感兴趣的可以了解一下
    2023-07-07
  • Spring项目集成RabbitMQ及自动创建队列

    Spring项目集成RabbitMQ及自动创建队列

    这篇文章主要介绍了Spring项目集成RabbitMQ及自动创建队列,本文内容分别在Spring(V5.2.6)和Spring Boot(V2.5.14)两个项目中经过了验证,需要的朋友可以参考下
    2024-02-02
  • 配置Spring4.0注解Cache+Redis缓存的用法

    配置Spring4.0注解Cache+Redis缓存的用法

    本篇文章主要介绍了详解配置Spring4.0注解Cache+Redis缓存的用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • java编程FinalReference与Finalizer原理示例详解

    java编程FinalReference与Finalizer原理示例详解

    这篇文章主要为大家介绍了java编程FinalReference与Finalizer的核心原理以及示例源码的分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-01-01
  • java中进程与线程_三种实现方式总结(必看篇)

    java中进程与线程_三种实现方式总结(必看篇)

    下面小编就为大家带来一篇java中进程与线程_三种实现方式总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Hibernate双向一对一映射关系配置代码实例

    Hibernate双向一对一映射关系配置代码实例

    这篇文章主要介绍了Hibernate双向一对一映射关系配置代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 使用JAXBContext轻松实现Java和xml的互相转换方式

    使用JAXBContext轻松实现Java和xml的互相转换方式

    这篇文章主要介绍了依靠JAXBContext轻松实现Java和xml的互相转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • tio-boot框架整合ehcache实现过程示例

    tio-boot框架整合ehcache实现过程示例

    这篇文章主要为大家介绍了tio-boot框架整合ehcache实现过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Spring负载均衡LoadBalancer使用详解

    Spring负载均衡LoadBalancer使用详解

    这篇文章主要介绍了Spring负载均衡LoadBalancer使用详解,Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器, 用来替代Ribbon,Spring官方提供了两种客户端都可以使用loadbalancer,需要的朋友可以参考下
    2023-11-11
  • SpringBoot的自动配置原理解析

    SpringBoot的自动配置原理解析

    这篇文章主要介绍了SpringBoot的自动配置原理解析,SpringBoot的自动配置要从它的启动类@SpringBootApplication说起,点进注解,@Target设置当前注解可以标记在哪,(ElementType.type)表示标注在类上面,需要的朋友可以参考下
    2023-08-08

最新评论