Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
Lambda 表达式在Java 语言中引入了一个新的语法元 素和操作符。这个操作符为 “->” , 该操作符被称 为 Lambda 操作符或剪头操作符。它将 Lambda 分为 两个部分:
- 左侧:Lambda 表达式的参数列表
- 右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体
//原来使用匿名内部类作为参数传递
TreeSet<String> ts = new TreeSet<>(new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
});
//Lambda 表达式作为参数传递
TreeSet<String> ts2 = new TreeSet<>(
(x, y) -> Integer.compare(x.length(), y.length())
);
Lambda 表达式需要“函数式接口”的支持
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰 (可以检查是否是函数式接口,如果不是函数式接口则会编译不通过)
例如:
@FunctionalInterface
public interface MyFun {
public Integer getValue(Integer num);
}
Java8 内置的四大核心函数式接口
语法格式一:无参数,无返回值
() -> System.out.println("Hello Lambda!");
//原来使用匿名内部类
Runnable r1 = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Hello Word!!");
}
};
r1.run();
//Lambda 表达式
Runnable r2 = () -> System.out.println("Hello Lambda!!");
r2.run();
语法格式二:有一个参数,并且无返回值(只有一个参数可以省去括号)
(x) -> System.out.println(x) 省去括号后 x -> System.out.println(x)
/**
* Consumer<T> : 消费型接口
* void accept(T t);
*/
//原来使用匿名内部类
Consumer<String> con = new Consumer<String>() {
@Override
public void accept(String x) {
// TODO Auto-generated method stub
System.out.println(x);
}
};
con.accept("Hello Word!!");
//Lambda 表达式
Consumer<String> con1 = (x) -> System.out.println(x);
con1.accept("Hello Lambda!!");
//Lambda 表达式(一个参数可以无括号)
Consumer<String> con2 = x -> System.out.println(x);
con2.accept("Hello Lambda2!!");
语法格式三:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句(需要使用花括号括起来)
//原来使用匿名内部类
Comparator<Integer> com = new Comparator<Integer>() {
@Override
public int compare(Integer x, Integer y) {
System.out.println("匿名内部类 输出!!");
return Integer.compare(x, y);
}
};
System.out.println(com.compare(23, 44));
//Lambda 表达式
Comparator<Integer> com1 = (x, y) -> {
System.out.println("Lambda 输出!!");
return Integer.compare(x, y);
};
System.out.println(com1.compare(23, 44));
语法格式四:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
//原来使用匿名内部类
Comparator<Integer> com = new Comparator<Integer>() {
@Override
public int compare(Integer x, Integer y) {
return Integer.compare(x, y);
}
};
System.out.println(com.compare(23, 44));
//Lambda 表达式
Comparator<Integer> com1 = (x, y) -> Integer.compare(x, y);
System.out.println(com1.compare(23, 44));
语法格式五:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”(参数如果写就都写上去,不能写一部分空一部分)
(Integer x, Integer y) -> Integer.compare(x, y);
//原来使用匿名内部类
Comparator<Integer> com = new Comparator<Integer>() {
@Override
public int compare(Integer x, Integer y) {
return Integer.compare(x, y);
}
};
System.out.println(com.compare(23, 44));
//Lambda 表达式写了数据类型
Comparator<Integer> com1 = (Integer x, Integer y) -> Integer.compare(x, y);
System.out.println(com1.compare(23, 44));
//Lambda 表达式不写数据类型
Comparator<Integer> com2 = (x, y) -> Integer.compare(x, y);
System.out.println(com2.compare(23, 44));
总结
Lambda 表达式需要配合“函数式接口”使用,“函数式接口”可以自定义编写,Java8也内置了一部分常用的“函数式接口”。
若只有一个参数左边的括号可以省,若右侧只有一条语句花括号可以省,左侧可以推断出的类型也可以省。
本人小小菜鸟,难免会有错误,希望大神们看到能够及时指出。৳৸ᵃᵑᵏ Ꮍ৹੫ᵎ
参考链接
热门评论
总结的语法说明很不错,收藏了
总结的很不错,赞一个