blackcat

java8新特性

特性:速度更快、代码更少,强大的Stream API、便于并行、最大化减少空指针异常 Optional。核心为Lambda表达式和Stream API,总共分为以下几个部分:

  1. Lambda表达式
  2. 函数式接口
  3. 方法引用与构造器引用
  4. Stream API
  5. 接口中的默认方法与静态方法
  6. 新时间日期API
  7. 其他新特性

Lambda表达式

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

Lambda表达式初体验

开一个线程,打印hello lambda!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 开一个线程 打印 hello
@Test
public void test00() {
// 之前的写法
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello lambda!");
}
});
thread.run();
// lambda写法
Thread thread1 = new Thread(() -> System.out.println("hello lambda!"));
thread1.run();
}

看起来Lambda表达式写起来是不是更加优雅,简短。

Lambda表达式语法

Lambda表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “->” , 该操作符被称 为Lambda操作符或箭头操作符。它将 Lambda 分为 两个部分,左侧:指定了Lambda表达式需要的所有参数 右侧:指定了Lambda体,即Lambda表达式要执行的功能

语法格式一

Lambda表达式不需要参数时候,没有返回值时,Lambda体只需要一条语句

1
2
3
4
5
6
7
@Test
public void test01() {
// Runnable 接口 线程的接口
Runnable runnable = () -> System.out.println("hello lambda!");
// 调用方法
runnable.run();
}

语法格式二

Lambda体,没有返回值,需要一个参数

1
2
3
4
5
6
7
@Test
public void test02() {
// Consumer 接口 1.8才有的 表示接受单个输入参数并且不返回任何值的一个操作
Consumer consumer = (msg) -> System.out.println(msg);
// 调用方法 accept接收任意参数 T
consumer.accept("hello lambda!");
}

语法格式三

Lambda体,没有返回值,需要一个参数时,参数的小括号可以省略

1
2
3
4
5
6
7
@Test
public void test03() {
// Consumer 接口 1.8才有的 表示接受单个输入参数并且不返回任何值的一个操作
Consumer consumer = msg -> System.out.println(msg);
// 调用方法 accept接收任意参数 T
consumer.accept("hello lambda!");
}

语法格式四

Lambda体,没有返回值,需要两个参数时,并且有返回值

1
2
3
4
5
6
7
8
9
10
11
@Test
public void test04() {
// Comparator 接口 一个比较的操作
Comparator<Integer> comparator = (Integer x, Integer y) -> {
System.out.println("实现接口的方法:");
// 这里调用了 Integer compare 比较方法 比较两个值的大小 返回 -1(<) 0(=) 1(>)
return Integer.compare(x, y);
};
// 调用方法
System.out.println(comparator.compare(12, 13));
}

语法格式五

Lambda体只有一条语句时,有返回值时,return与大括号可以省略

1
2
3
4
5
6
7
8
@Test
public void test05() {
// Comparator 接口 一个比较的操作
// 这里调用了 Integer compare 比较方法 比较两个值的大小 返回 -1(<) 0(=) 1(>)
Comparator<Integer> comparator = (Integer x, Integer y) -> Integer.compare(x, y);
// 调用方法
System.out.println(comparator.compare(12, 13));
}

语法格式六

Lambda表达式的参数类型可以省略,可由编译器根据上下文推断得出类型:类型推断

1
2
3
4
5
6
7
8
9
10
11
12
 @Test
public void test06() {
// Comparator 接口 一个比较的操作
Comparator<Integer> comparator = (x, y) -> {
// (x,y) 数据类型可以省略,可由编译器根据上下文推断得出类型,
System.out.println("实现接口的方法:");
//这里调用了 Integer compare 比较方法 比较两个值的大小 返回 -1(<) 0(=) 1(>)
return Integer.compare(x, y);
};
// 调用方法
System.out.println(comparator.compare(12, 13));
}

我的小结

lambda表达式像是一个代码片段,由 ‘->’(箭头操作符)分为两部分,左侧为参数列表,参数类型可以省略不写,右侧为lambda体,其实就是接口的实现代码。


 评论