一、lambda表达式是什么
lambda表达式, 是Java8中的一个新特性。lambda表达式允许你通过表达式来代替功能接口。
二.lambda表达式语法
(args1,args2) -> body
或
(args1,args2) ->{ body}
1、可选类型声明:可以不指定参数类型,编译器可以根据上下文推断参数值。
2、可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要包含在圆括号内并用逗号间隔。
3、可选的大括号:如果表达式主体只包含了一个语句,就不需要使用大括号,多条表达式语句需要包含在大括号内。
4、可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,如果有多个表达式且有返回值,需要用return显式指定返回值。
例如:
//接收一个参数s并在控制台打印
(String s)->System.out.println(s)
//接收两个int型参数x和y,并返回它们的和
(int x, int y) -> x + y
//不需要参数,返回值为6
()->6
//接收两个参数x和y,并返回它们的乘积
(x,y)->{return x*y;}
//在控制台打印Hello World
()->System.out.println("Hello world")
三.基于函数式接口使用 lambda 表达式
lambda 表达式的使用需要借助于函数型接口,也就是说只有函数型接口出现的地方,我们才可以将其用 lambda 表达式进行简化。那么什么是函数接口?函数型接口就是只有一个抽象方法的接口。
还是用我们上面的例子,用lambda表达式实现代码:
public static void main(String[] args) { Test t=new Test(); t.show(()->System.out.println("Hello")); }
函数接口最多只能有一个抽象方法,但是可以有多个默认方法和静态方法。
我们可以用default关键字在接口中定义具备方法体的默认方法。
示例:
@FunctionalInterface public interface Inner { public void show(); //默认方法 default String show2() { return "World"; } //静态方法 static String show3() { return "Java"; } }
在定义时我们为该接口添加了@FunctionalInterface注解,用于标记该接口是一个函数式接口,不过该注解是可选的,当添加了该注解之后,编译器会限制了该接口只允许有一个抽象方法,否则报错,所以推荐为函数式接口添加该注解。
四.lambda表达式示例
1、启动一个新线程
new Thread(()->System.out.println("启动新线程")).start();
2、遍历List
List<String> items = new ArrayList<>(); items.add("H"); items.add("e"); items.add("l"); items.add("l"); items.add("o"); items.forEach(item->System.out.print(item));
在 Java8 中,为 Iterable 接口添加了默认的 forEach 方法,而 Collection 接口继承了 Iterable 接口,所以所有的继承自 Collection 的集合类都可以直接调用 forEach 方法。
3、对List进行排序并输出
List<Integer> items = new ArrayList<>(); items.add(3); items.add(7); items.add(5); items.add(2); items.add(9); items.sort((o1,o2)->o1-o2); System.out.println(items);
输出结果:
[2, 3, 5, 7, 9]
上面的例子我们调用sort()方法对List进行排序,sort方法接受一个Comparator接口的实现类,这个接口中有且仅有一个方法compare。
Comparator接口源码:
public interface Comparator { int compare(T o1, T o2); boolean equals(Object obj); }
我们可以看到Comparator接口有两个抽象方法,equals是继承自Object的方法,所以可以用lambda表达式。
在Java中,Object类是所有类的父类。
0条评论
点击登录参与评论