关于java:JDK8新特征Lambda函数式接口StreamAPI

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 内置四大外围函数式接口:

  • Consumer<T>: 消费型接口,示意一个承受单个输出参数并返回没有后果的操作。对类型为T的对象利用操作。接口办法: void accept(T t)
  • Supplier<T>: 供应型接口,相似一个供应商,返回一个类型为T的对象。接口办法: T get()
  • Function<T, R>: 函数型接口,示意一个承受一个参数并产生后果的函数。接口办法: R apply(T t)
  • Predicate<T>: 断言型接口,确定类型为T的对象是否满足某束缚,并返回boolean 值。接口办法: boolean test(T t)

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 操作是提早执行的。这也意味着他们会等到须要后果的时候才执行。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理