Lambda 表达式允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
语法
lambda 表达式的语法格式如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
以下是lambda表达式的重要特征:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
主要还是贴几个例子,加深自己的理解
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* jdk 1.8 新特性
* Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
* lambda 表达式的语法如下:
* (parameters) -> expression
* 或
* (parameters) ->{ statements; }
*
* 可以把 Lambda 表达式理解为是一段可以传递的代码(将代码作为实参),
* 也可以理解为函数式编程,将一个函数作为参数进行传递。
*
*/
public class jdkNewFuture {
public static void main(String[] args) {
List<String> names1 = new ArrayList<>();
names1.add("Gooogle");
names1.add("Runoob");
names1.add("Taobao");
names1.add("Baidu");
names1.add("Sina");
System.out.println("使用jdk7实现排序");
sortByJdk7Grammer(names1);
for (String name:names1){
System.out.println(name);
}
System.out.println("使用jdk8实现排序");
List<String> names2 = new ArrayList<>();
names2.add("Gooogle");
names2.add("Runoob");
names2.add("Taobao");
names2.add("Baidu");
names2.add("Sina");
sortByJdk8Grammer(names2);
for (String name:names2){
System.out.println(name);
}
/**
* 使用匿名内部类新建线程
*/
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程1,基于匿名内部类的线程已经新建!");
}
}).start();
/**
* 使用labmda表达式新建线程:从上面的正常建立方法可以看出来
* new Thread() 括号里需要传递的是一个Runnable()类型的对象,
* 这个对象没有需要传递进去的参数,所以lambda表达式的格式的开头是 ()->
* 然后是{},他的具体逻辑为 执行System.out.println() 操作
* 所以写好之后是() -> System.out.println("线程2,基于lambda表达式的线程已经新建!")
* 将这段代码作为 new Thread 的参数
*/
new Thread(()-> System.out.println("线程2,基于lambda表达式的线程已经新建!")).start();
}
/**
* 使用jdk7 实现排序,即重写compare方法
* @param names
*/
private static void sortByJdk7Grammer(List<String> names){
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
}
/**
* 使用lambda表达式 重写排序方法
* 参数为(s1,s2)
* 代码执行的逻辑为 s1.compareTo(s2)
* 所以修改成lambda表达式之后为(s1,s2)->s1.compareTo(s2)
* @param names
*/
private static void sortByJdk8Grammer(List<String> names){
Collections.sort(names,(s1,s2)->s1.compareTo(s2));
}
}