Java8的特性

Java8概述

  1. Java8(又称jdk1.8)是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java8

  2. 支持Lambda表达式

  3. 函数式接口

  4. 新的Stream API

  5. 新的日期 API

  6. 其他特性

    Lambda表达式

  7. Lambda表达式:特殊的匿名内部类,语法更简洁

  8. Lambda表达式允许把函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递

  9. 基本语法

    <函数式接口> <变量名> =(参数1,参数2……)-> {

    ​ //方法体

    }

  10. Lambda引入了新的操作符 “ ->“,左侧是参数列表,右侧是方法体

  11. 注意事项:

    1. 形参列表的数据类型会自动推断
    2. 如果形参列表为空,只需保留 ( )
    3. 如果形参只有 1 个,( ) 可以省略,只需要参数的名字即可
    4. 如果执行语句只有 1 句,且无返回值,{} 可以省略,若有返回值,则若想省去 {} ,则必须同时省略 return ,且执行语句也保证只有 1 句
    5. Lambda不会生成一个单独的内部类文件

示例:实现Runnable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static void main(String[] args) {
function1();
function2();
}
/*匿名内部类*/
static void function1(){
Runnable runnable = new Runnable() {
@Override
public void run() {
System.err.println("thread1---匿名内部类");
}
};
new Thread(runnable).start();
}
/*Lambda表达式*/
static void function2(){
Runnable runnable = () -> {
System.err.println("thread2---Lambda表达式1");
};
new Thread(runnable).start();
/*只有一条语句,可以省略大括号*/
new Thread(()->System.err.println("thread3---Lambda表达式2")).start();
}

函数式接口

  1. 如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口可以使用Lambda表达式,Lambda表达式会被匹配到这个抽象方法上
  2. @FunctionalInterface注解 检测接口是否符合函数式接口
  3. 常见函数式接口:
    1. Predicate 接口只有一个参数,返回boolean类型。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非);
    2. Function 接口有一个参数并且返回一个结果,并附带了一些可以和其他函数组合的默认方法(compose, andThen);
    3. Supplier 接口返回一个任意范型的值,和Function接口不同的是该接口没有任何参数;
    4. Consumer 接口表示执行在单个参数上的操作;
    5. Comparator 是老Java中的经典接口, Java 8在此之上添加了多种默认方法;
    6. Optional 不是函数是接口,这是个用来防止NullPointerException异常的辅助类型;

方法引用

  1. 方法引用是Lambda的一种简写形式 。如果Lambda表达式方法体中只是调用一个特定的已经存在的方法,则可以使用方法引用
  2. 常见形式:
    1. 对象 :: 实例方法
    2. :: 静态方法
    3. :: 实例方法
    4. :: new

Stream

  1. 流(Stream)中保存对集合或数组数据的操作。和集合类似,但集合中保存的是数据
  2. Stream 自己不会存储元素
  3. Stream 不会改变源对象。相反它们会返回一个持有结果的新 Stream
  4. Stream 操作是延迟执行的。这意味着它们会等到需要结果的时候才会执行
  5. Stream 使用步骤:
    1. 创建:新建一个流
    2. 中间操作:在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作
    3. 终止操作:使用一个终止操作来产生一个结果。该操作会强制它之前的延迟操作立即执行。在这之后该Stream就不能使用了
  6. 创建Stream
    1. 通过Collection对象的 stream( ) 或 parallelStream( ) 方法
    2. 通过Arrays 类的 stream( ) 方法
    3. 通过Stream接口的 of( )、iterate ( )、generate( )方法
    4. 通过IntStream、LongStream、DoubleStream接口中的 of 、range 、rangeClosed方法
  7. 中间操作
    1. filter (概率)、limit (限制)、skip (跳过)、distinct (去重)、sorted(排序)
    2. map
    3. parallel (并行)
  8. 终止操作
    1. forEach 、min 、max 、count 、map 、reduce (规约)、collect (收集)