相关源码地址:https://github.com/liudongdong0909/java8/tree/master/java8-Lambda/src/com/donggua
从java8出现以来lambda是最重要的特性之一,它可以让我们用简洁流畅的代码完成一个功能。 很长一段时间java被吐槽是冗余和缺乏函数式编程能力的语言,随着函数式编程的流行java8种也引入了 这种编程风格。在此之前我们都在写匿名内部类干这些事,但有时候这不是好的做法,本文中将介绍和使用lambda, 带你体验函数式编程的魔力。
一、JAVA8 新特性简介
速度更快
代码更少(增加了新的语法 Lambda 表达式)
强大的 Stream API
便于并行
最大化减少空指针异常 Optional
二、为什么使用Lambda表达式
- Lambda 是一个 匿名函数, 我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更加紧凑的代码风格,使JAVA的语言表达能力得到了提升。
三、 栗子最能说明问题
3.1 第一个栗子:
未使用 Lambda 表达式之前的TreeSet中元素排序的方法(根据长度排序)– 匿名内部类
@Test
public void test(){
// 按长度排序 -- // 使用匿名内部类作为参数传递
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
};
TreeSet<String> treeSet = new TreeSet<>(comparator);
}
使用Lambda表达式之后:
@Test
public void test2(){
// 使用 Lambda 表达式作为参数传递
Comparator<String> comparator = (x, y) -> Integer.compare(x.length(), y.length());
TreeSet<String> treeSet = new TreeSet<>(comparator);
}
3.2 第二个栗子:
再比如我们在java7中创建一个线程
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("hello word");
}
};
runnable.run();
使用Lambda表达式创建一个线程
Runnable runnable2 = () -> System.out.println("hello word lambda");
runnable2.run();
执行结果:
四、 Lambda 表达式的基础语法
Lambda 基础语法: java8中引入了一个新的操作符 “->”, 该操作符称为 箭头操作符 或者 Lambda操作符
Lanbda 操作符将Lambda 表达式拆分成两部分
左侧: Lambda 表达式需要的所有参数列表
右侧: Lambda 表达式要执行的功能, 即Lambda 体, 方法体
五、Lambda 表达式语法格式
5.1 语法格式一: 无参, 无返回值, Lambda体只需要一条语句
5.2 语法格式二: Lambda 需要一个参数
5.3 语法格式三 : Lambda只需要一个参数时,Lambda操作符左侧参数的小括号可以省略
5.4 语法格式四: Lambda 需要两个参数, 并且有返回值
5.5 语法格式五: 当Lambda体只有一条语句时, return 与 大括号可以省略
5.6 语法格式六: Lambda 操作符左侧的参数列表的数据类型可以省略
六、Lambda 表达式中的类型推断
类型推断: 上面案例中, Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型, 程序依然可以编译, 这是因为 javac 根据程序的上下文, 在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境, 是由编译器推断出来的。这就是所谓的 – 类型推断
相关源码地址:https://github.com/liudongdong0909/java8/tree/master/java8-Lambda/src/com/donggua
以上就是全文的内容,由于水平有限,文章中难免会有错误,希望大家指正。谢谢~