Lambda表达式
Lambda 表达式(Lambda expression)可以看作是一个匿名函数。
1.Lambda表达式的语法
基本语法: (parameters) -> expression 或 (parameters) ->{ statements; }
Lambda表达式由三部分组成:
- 1.paramaters:类似于方法中形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可以不声明而由JVM隐含判断。另外当只有一个推断类型时可以省略掉圆括号。
- 2.->:可以理解为“被用于”的意思;
- 方法体:可以是表达式也可以是代码块,是函数式接口里方法的实现。代码块可以返回一个值或者什么都不返回,这里的代码块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不返回。
2.函数式接口
- 一个接口有且只有一个抽象方法 ;
注意:
- 1.如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口;
- 2.如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。
3.变量捕获
@FunctionalInterface
interface NoParameterNoReturn {
void test();
}
public static void main(String[] args) {
int a = 10;
NoParameterNoReturn noParameterNoReturn = ()->{
// a = 99; error
System.out.println("捕获变量:"+a);
};
noParameterNoReturn.test();
}
4.演示Lambda表达式
4.1forEach演示
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("hello");
list.add("bit");
list.add("word");
list.add("lambda");
list.forEach(s -> {
System.out.println(s);
});
}
4.2List接口中sort()演示
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("hello");
list.add("bit");
list.add("word");
list.add("lambda");
/*list.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();//按照长度进行升序排序
}
});
System.out.println(list);*/
list.sort((o1,o2) -> o1.length()-o2.length());
System.out.println(list);
}
4.3HashMap的forEach接口演示
public static void main(String[] args) {
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "hello");
map.put(2, "bit");
map.put(3, "hello");
map.put(4, "lambda");
map.forEach(new BiConsumer<Integer, String>() {
@Override
public void accept(Integer integer, String s) {
System.out.println(integer+" "+s);
}
});
System.out.println("Lambda表达式=========");
map.forEach((k,v) -> {
System.out.println(k+" "+v);
});
}