博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java8新特性Lambda表达式
阅读量:3960 次
发布时间:2019-05-24

本文共 3207 字,大约阅读时间需要 10 分钟。

java8新特性

1.简介

  • 为什么使用java8新特性?

    • 速度更快
    • 代码更少(增加了新的语法lambda表达式)
    • 强大的Stream API
    • 便于并行
    • 最大化减少空指针异常Optional
    • Nashom引擎,允许在JVM上运行JS应用
  • java8是oracle公司于2014年3月发布,可以看成是自java5以来最具革命性的版本。java8为 java语言、编译器、类库、开发工具与JVM带来了大量新特性

2.lambda表达式

Lambda是一个匿名函数,我们可以把lambda表达式理解为是一段可以传递的代码(代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使java的语言表达能力得到了提示。

  1. 举例:(o1,o2)->{Integer.compare(o1,o2)}

  2. 格式:

    ->右边:lambda操作符或箭头操作符

    ->左边:lambda形参列表

    ->{ 重写方法的方法体 }

3.lambda表达式的六种使用方式

//第一种无参无返LambdaInterface01 lambdaInterface01 = () -> {
System.out.println("lambda第一种形式,无参无返形式");};//通过lambda接口实例调用方法lambdaInterface01.LambdaInfo();System.out.println("------------------------------");//第二种有参无返LambdaInterface02 lambdaInterface02 = (String param) -> {
System.out.println("lambda第二种形式,有参无返使用,参数是:" + param);};lambdaInterface02.LambdaInfo("周高帆");System.out.println("------------------------------");/*第三种,参数类型可以省略,参数名可以重新定义,因为可以通过编译器推断得出 称为“类型推断” */LambdaInterface03 lambdaInterface03=(param1, param2)->{
System.out.println("lambda第三种形式,类型推断,参数1:"+param1+",参数2:"+param2);};lambdaInterface03.LambdaInfo("我是参数1",2);System.out.println("------------------------------");//第四种:参数为一个时,()可以省略,例如:param->{内容}LambdaInterface04 lambdaInterface04=param -> {
System.out.println("lambda第四种形式,参数为单个时可以省略():"+param);};lambdaInterface04.LambdaInfo("我是第四种形式");System.out.println("------------------------------");//lambda第五种形式,lambda返回值LambdaInterface05 lambdaInterface05=(param1, param2) -> {
System.out.println("Lambda第五种形式,带有返回值"); return param1+param2;};String result1=lambdaInterface05.LambdaInfo("Hello","Word");System.out.println("------------------------------");//lambda第六种形式,方法体内只有一条代码的话,{}和return都可以省略LambdaInterface06 lambdaInterface06=() ->"我是第六种形式";String result2=lambdaInterface06.LambdaInfo();

4.lambda的本质:作为函数式接口的实例

3.函数式接口(Functional)

  1. 如果一个接口中只声明了一个抽象方法那么这个接口被称为函数式接口。(默认方法和静态方法不包括在内)
  2. 你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式)抛出一个受检查异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法是进行声明)。
  3. 我们可以在一个接口上使用@Funcational注解,这样做可以检查它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。
  4. 在java.util.function包下定义了java8的丰富的函数式接口

4.Java内置的函数式接口

在这里插入图片描述

1.消费型接口Consumer,方法 void accept(T t);

2.供给型接口Supplier,方法 T get();

3.函数型接口Function<T,R>方法 R apply(T t);

4.断定型接口Predicate 方法 boolean test(T t);

5.方法和构造器引用

  • 方法引用

    • 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
    • 方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
    • 要求: 实现接口的抽象方法的参数列表和返回值类型必须与方法引用的方法的参数列表和返回值类型保持一致!
    • 格式: 使用操作符 ” :: “ 将类(或对象)与方法名分隔开来。
      • 对象::实例方法名
      • 类::静态方法名
      • 类::实例方法名

6.Stream API

Stream到底是什么?

是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。

“集合讲的是数据,Stream讲的是计算”

注意:

  1. Stream自己不会存储元素。

  2. Stream不会改变源对象,相反,他们会返回一个持有结果的新Stream。

  3. Stream操作是延迟执行的,这意味着他们会等到需要结果的时候才执行。

java8中有两大最为重要的改变。第一个是Lambda表达式;另外一个则是Stream API。

  • Stream API (java.util.stream)把真正的函数式编程风格引入到java中。这是目前为止对java类库最好的补充,因为Stream API可以极大提供java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
  • Stream 是java8中处理集合的关键抽象概率,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询。也可以使用Stream API来并行执行操作。简言之,Steam API提供了一种高效且易于使用的处理数据的方式。

Stream 的三个操作步骤

  • 创建Stream

    • 一个数据源(如:集合、数组),获取一个流
  • 中间操作

    • 一个中间操作链,对数据源的数据进行处理
  • 终止操作(终端操作)

    • 一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用。

tream

  • 一个数据源(如:集合、数组),获取一个流

  • 中间操作

    • 一个中间操作链,对数据源的数据进行处理
  • 终止操作(终端操作)

    • 一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用。

转载地址:http://qmqzi.baihongyu.com/

你可能感兴趣的文章
我的软件工程之路(五)—四个月总结
查看>>
从入职到离职的收获——ICT四个月
查看>>
项目中用到的一个导入Excel的方法
查看>>
项目中一个用于导出word的方法
查看>>
项目中用到小技术点
查看>>
管理数据库连接不得不注意的地方
查看>>
KS系统总结
查看>>
测试Jsp 静态包含和动态包含
查看>>
简析几种常用的Web监听
查看>>
Web应用过滤器Fileter
查看>>
代理模式(Proxy)
查看>>
采用动态代理对事务进行封装
查看>>
采用ThreadLocal维护Connection
查看>>
测试JSTL表达式
查看>>
一口一口吃掉Struts(六)——动态ActionForm
查看>>
一口一口吃掉struts(七)——ActionForward知多少
查看>>
浅析Hibernate映射(二)——关系映射(3)
查看>>
浅析Hibernate映射(四)——组件映射(component)
查看>>
Hibernate性能优化
查看>>
Spring核心ioc
查看>>