Lambda表达式,又称闭包,Java8的新特性之一。
1、语法
(parameters) -> expression
或
(parameters) ->{ statements; }
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数(圆括号):一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的执行功能(大括号):如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
2、简单使用
package com.geostar.geosmarter;
/**
* Java8的Lambda表达式
* 1、Lambda表达式需要函数式接口的支持
* 2、函数式接口定义: 接口中只有一个抽象方法的接口,称为函数式接口。
* 3、可以使用注解 @FuncitonalInterface 修饰,其修饰作用为:限定该接口必须为函数式接口,即该接口中有且只有一个抽象方法。否则无法通过编译。即可以检查是否为函数式接口。
* */
public class Test10 {
public static void main(String[] args) {
// 无参数,有返回值
Lambda_A a = () -> 5;
System.out.println(a.operation());
// 一个参数(参数的括号可写可不写),有返回值
Lambda_B b = (x) -> 2 * x;
System.out.println(b.operation(10));
// 两个参数(数字),有返回值
Lambda_C<Integer,Integer> c = (x, y) -> x - y;
System.out.println(c.operation(20, 30));
// 接收2个int型整数,有返回值
Lambda_D d = (int x, int y) -> x + y;
System.out.println(d.operation(10, 20));
// 无括号,无返回值
Lambda_E e = (String s) -> System.out.println(s);
e.operation("nihao");
// 有括号,带返回值
Lambda_F f = (String s) -> {
System.out.println(s);
return s + s;
};
System.out.println(f.operation("hello"));
}
interface Lambda_A {
int operation();
}
interface Lambda_B {
int operation(int a);
}
interface Lambda_C<P,R> {
R operation(P a,P b);
}
interface Lambda_D {
int operation(int a,int b);
}
interface Lambda_E {
void operation(String a);
}
interface Lambda_F {
String operation(String a);
}
}
3、Java内置四大核心接口
package com.geostar.geosmarter;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
* Java内置四大核心接口
* Consumer<T> 消费型接口 消费对象
* void accept(T t);
* Supplier<T> 供给型接口 生成对象
* T get();
* Function<R,T> 函数型接口 指定特定功能
* R apply(T t);
* Predicate<T> 断言型接口 进行条件判断
* boolean test(T t);
* */
public class Test11 {
public static void main(String[] args) {
//消费型接口(有参,无返回值)
Consumer<String> c = s -> System.out.println(s);
c.accept("打印消费对象");
//供给型接口(无参,有返回值)
Supplier<List<Integer>> s = () -> {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
return list;
};
List<Integer> list = s.get();
System.out.println(list);
//函数型接口(有参,有返回值)
Function<String,String> f = param -> {
return param.toUpperCase();
};
System.out.println(f.apply("abcd"));
//断言型接口(有参,返回true或false)
Predicate<Object> p = param -> {
return param instanceof Integer;
};
System.out.println(p.test("aaa"));
System.out.println(p.test(132));
}
}
4、应用场景
4.1、流式数据过滤
package com.geostar.geosmarter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Java8的Lambda表达式应用场景
* */
public class Test12 {
public static void main(String[] args) {
//流式处理数据
List<Integer> list = Arrays.asList(2,5,9,6,8,5,10,45,99,26,36);
List<Integer> list1 = list.stream().filter(i -> i >= 5).collect(Collectors.toList());//筛选大于5的数
System.out.println(list1);//[5, 9, 6, 8, 5, 10, 45, 99, 26, 36]
List<Integer> list2 = list.stream().map(i -> i * i).collect(Collectors.toList());//转成平方列表
System.out.println(list2);//[4, 25, 81, 36, 64, 25, 100, 2025, 9801, 676, 1296]
Map<Boolean, List<Integer>> map = list.stream().collect(Collectors.groupingBy(i -> i % 2 == 0)); //根据奇偶性分组
System.out.println(map);//{false=[5, 9, 5, 45, 99], true=[2, 6, 8, 10, 26, 36]}
List<Integer> list3 = list.stream().filter(i -> i % 2 == 0).map(i -> i * i).distinct().collect(Collectors.toList());//复合操作
System.out.println(list3);//[4, 36, 64, 100, 676, 1296]
}
}