饥人谷技术博客

JDK8新特征:Lambda,函数式接口,StreamAPI

2020-11-24  本文已影响0人  _Jun

JDK8的重要新特性之一——Lambda表达式:


Lambda 表达式也可称为闭包,是推动 Java 8 发布的最重要新特性。Lambda表达式实质上是一个匿名方法,Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)或者把代码看成数据。使用 Lambda 表达式可以使代码变的更加简洁紧凑。

Lambda表达式的语法结构:

(参数列表) -> {代码块}

需要注意:

· 参数类型可省略,编译器可以自己推断
· 如果只有一个参数,圆括号可以省略
· 代码块如果只是一行代码,大括号也可以省略
· 如果代码块是一行,且是有结果的表达式, return 可以省略

(param1,param2)->{   
}
(type1 param1,type2 param2)->{
    body
}

箭头左边是抽象方法的参数  右边是抽象方法实现体

1)一个Lambda表达式可以有零个或多个参数。
2)所有参数需要包含在圆括号内,参数之间用逗号相隔。
3)圆括号代表参数集为空。例如()->42.
4)参数的类型既可以明确声明,也可以根据上下文来推断。

函数式接口:


只包含一个抽象方法的接口,称为函数式接口;

Runnable 、Comparator 都是函数式接口的典型代表。在实践中,函数接口是非常脆弱的,只要有人在接口里添加多一个方法,那么这个接口就不是函数接口了,就会导致编译失败。Java8提供了一个特殊的注解@FunctionalInterface 来克服上面提到的脆弱性并且显示地表明函数接口。

1,Function类型接口:

 @FunctionalInterface
 public interface Function<T,R> {
    //接收一个参数T,返回一个结果R
    R apply(T t);
}

【Function代表的是有参数,有返回值的函数。】

2,Consumer系列:

 @FunctionalInterface
 public interface Consumer<T> {
    //接收T类型参数,不返回结果
   void accept(T t);
}

【Consumer系列与Function系列一样,有各种衍生接口,但不返回任何结果。】

3, Predicate系列:

 @FunctionalInterface
 public interface  Predicate<T> {
    //接收T类型参数,返回boolean类型结果
    boolean test(T t);
}

Java 内置四大核心函数式接口:

StreamAPI:


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

新增的Stream API(java.util.stream)将生成环境的函数式编程引入了Java库中。这是目前为止最大的一次对Java库的完善,以便开发者能够写出更加有效、更加简洁和紧凑的代码。

流(Stream)到底是什么?

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

Stream 的操作三个步骤:

  1. 创建 Stream: 一个数据源(如:集合、数组),获取一个流。
  2. 中间操作: 一个中间操作链,对数据源的数据进行一系列处理。
  3. 终止操作(终端操作): 一个终止操作,执行中间操作链,并产生结果。

注意:

  1. Stream 自己不会存储元素。
  2. Stream 不会改变源对象。相反,他们会返回一个持有结果的新 Stream。
  3. Stream 操作是延迟执行的。这也意味着他们会等到需要结果的时候才执行。
上一篇下一篇

猜你喜欢

热点阅读