###前言:
接上一篇 JAVA8新特性之(函数式接口):http://blog.csdn.net/xinghuo0007/article/details/78595720
###知识点零:Lambda表达式使用的前提
Lambda语法使用的前提是函数式接口哦! 不要忘记了! 重要,重要,重要。。。
###知识点一:Lambda表达式语法
前提必备:
1.java8新增了一个新的操作符 " -> ",该操作符成为箭头操作符或者成为Lambda操作符。箭头操作符将Lambda表达式分割成量部分
左侧:Lambda表达式的参数列表
右侧:Lambda表达式的功能体,即Lambda表达式的功能是现实体也成为Lambda体
基础语法:(参数类型)-> Lambda体
具体表现:
(参数类型)-> Lambda表达式
或者
(参数类型)-> 代码块
###知识点二:Lambda表达式语法的具体表现形式
表现形式一:无参数,无返回值
() ->Lambda体
例如:
()->System.out.println("hello Lambda");
表现形式二:有一个参数,无返回值
(x) - > Lambda体
例如:
(x) - > System.out.println(x);
表现形式三:若只有一个参数,小括号可以省略不写
x -> Lambda体
例如:
x - > System.out.println(x);
表现形式四:有两个或者两个以上的参数,有返回值,并且Lambda体有多条语句
(x,y) -> Lambda体
例如:
(x,y)- > {
System.out.println(x)
System.out.println(y)
return 返回值;
};
表现形式五:若Lambda体中只有一条语句,{} 和 返回值 可以省略
表现形式六:Lambda表达式的参数列表可以不写数据类型,以为编译器能够通过上下文自动推断数据类型
###知识点二:Lambda表达式语法的具体表现形式
1.无参数,无返回值的情况。举例接口:Runnable
注意:
这里并没有开启线程,只是单纯的调用Runnable的run方法
//传统方法
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("hello runnable !");
}
};
runnable.run();// 打印:hello runnable !
//Lambda表达式
runnable = () -> System.out.println("hello Lambda!");
runnable.run(); // 打印:hello Lambda!
2.有一个参数,无返回值。举例接口:自定义接口DAO
/**
* 接口
*/
@FunctionalInterface
interface DAO<T> {
void test(T t);
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
DAO<String> dao = (s) -> System.out.println(s);
dao.test("hello DAO !");//打印:hello DAO !
}
}
3.若只有一个参数,小括号可以省略不写。 举例接口:自定义接口DAO
/**
* 接口
*/
@FunctionalInterface
interface DAO<T> {
void test(T t);
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
DAO<String> dao = s -> System.out.println(s);
dao.test("hello DAO !");//打印:hello DAO !
}
}
4.有两个或者两个以上的参数,有返回值,并且Lambda体有多条语句。举例接口:Compartor
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Comparator<Integer> comparator = (x,y) -> {
System.out.println("x = "+ x);
System.out.println("y = "+ y);
return Integer.compare(x,y);
};
int result = comparator.compare(10,20);
System.out.println("result = "+ result); // result = -1
}
}
5 若Lambda体中只有一条语句,{} 和 返回值 可以省略; 举例接口:Compartor
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Comparator<Integer> comparator = (x,y) -> Integer.compare(x,y);
int result = comparator.compare(10,20);
System.out.println("result = "+ result); // result = -1
}
}
6.Lambda表达式的参数列表可以不写数据类型,以为编译器能够通过上下文自动推断数据类型
以上案例中,Lambda表达式的参数列表中都没有声明数据类型;
值得一提的是,如果你非要声明类型的话,一定都要写,如有两个参数,你要写数据类型,必须两个参数都要写;如果只写一个的话,会编译报错;
建议:都不写!
本人博客:https://elfgirl.top/