本文将用以下几类做介绍:
- 可以用来做什么
- 使用方法
- 属性
- 理论知识、注意事项
-
可以用来做什么
可以简化代码,最直观的感受就是在实现接口的时候简化代码,而适用于lambda表达式的接口称之为函数型接口(接口里只有一个抽象方法),这种类型的接口也称为SAM接口
-
使用方法
- 引入java8
按CTRL+SHIFT+ALT+S(File\Project Structure)打开
- 使用示例
接口定义
interface GetTime {
void getTime(String hours, String minutes);
}
实现接口中的方法,context后面的那个参数既为实现接口中的方法
private void setTextTime(final int textId) {
WindowUtils.getTimePickerDialog(context, (hours, minutes) -> {
String selectValue;
if (textId == R.id.tv_office_time_value) {
selectValue = DateUtils.getLiveUnit(Integer.parseInt(hours)) + hours + "点" + minutes + "分上班";
selectBuilder.append(selectValue);
} else {
selectValue = DateUtils.getLiveUnit(Integer.parseInt(hours)) + hours + "点" + minutes + "分下班";
selectBuilder.append("至").append(selectValue);
}
setTextValue(popUpView, textId, selectValue);
}).show();
}
-
属性
- Lambda 表达式的基础语法
Java8 中引入了一个新的操作符 -> 箭头操作符将 Lambda 表达式拆分成两部分:
1.操作符左侧:抽象方法的参数名,用(参数名列表)表达,不声明数据类型, 参数名称可自定义,示例:
(message,message1) -> {System.out.println("Hello " + message);{System.out.println("Hello " + message1);}
如果没有参数值则必须加(),示例:
() -> System.out.println("Hello message");
如果只有一个参数可不加(),示例:
message -> System.out.println("Hello " + message);
2.操作符右侧:Lambda 表达式中需要执行的功能,即方法的实现,如果方法体中只有一行代码,可不加大括号,示例:
() -> System.out.println("Hello message");
多行代码需要用大括号括起来,示例:
() -> {System.out.println("Hello " + message);{System.out.println("Hello " + message);}
有返回值用return返回,示例:
Comparator<Integer> com = (x, y) -> {
System.out.println("test");
return Integer.compare(x, y);
};
如果Lambda体中只有一条语句,并且有返回值,return和大括号都可以省略不写,示例:
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
-
理论知识、注意事项
接口要想支持Lambda表达式,该接口必须为函数式接口
函数式接口:
接口中只有一个抽象方法的接口,称为函数式接口。可以使用注解 @FunctionalInterface 修饰,可以检查是否是函数式接口
函数式接口可以有默认方法和静态方法。
任何满足单一抽象方法法则的接口,都会被自动视为函数接口。这包括 Runnable 和 Callable 等传统接口,以及您自己构建的自定义接口。
FunctionalInterface注解:
Java 8为函数式接口引入了一个新注解@FunctionalInterface,该注解对于接口是不是函数式接口没有影响,只是提醒编译器去检查该接口是否只包含一个抽象方法,函数式接口里是可以包含默认方法,示例:
@FunctionalInterface
interface GetTime {
void getTime(String hours, String minutes);
}