提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、Lambda表达式是什么?
Lambda是一个匿名函数,Lambdab表达式可以理解为是一段可以传递的代码。使用Lambda表达式可以写出更简洁、更灵活的代码。
@Test
public void test1() {
// 匿名内部类
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello Lambda");
}
};
r1.run();
System.out.println("----------------");
// Lambda 表达式
Runnable r2 = () -> System.out.println("Hello Lambda");
r2.run();
}
二、函数式接口
使用Lambda表达式的前提是具有函数式接口。只包含一个抽象方法的接口,称为函数式接口。
Java已经帮我们内置了四大函数式接口:
消费型接口:有参,无返回值
Consumer<T> :void accept(T t)
供给型接口:无参,有返回值
Supplier<T>:T get()
函数型接口:有参,有返回值
Function<T,R>:R apply(T t)
断言型接口:有参,返回boolean
Predicate<T>:boolean test(T t)
其他函数型接口:
接口名称 | 参数类型 | 返回类型 | 用途 |
BiFunction<T, U, R> | T, U | R |
对类型为 T, U 参数应用
操作, 返回 R 类型的
结 果。包含方法为
R apply(T t, U u)
|
UnaryOperator<T> (Function子 接口) | T | T |
对类型为T的对象进行一
元运算, 并返回T类型的
结果。包含方法为
T apply(T t)
|
BinaryOperator<T> | T, T | T |
对类型为T的对象进行二
元运算,并返回T类型的
结果。包含方法为
T apply(T t1, T t2)
|
BiConsumer<T, U> | T, U | void |
对类型为T, U 参数应用
操作。包含方法为
void accept(T t, U u)
|
ToIntFunction<T> ToLongFunction<T> ToDoubleFunction<T> | T | int long double |
分 别 计 算 int 、 long 、
double值的函数
|
IntFunction<R> LongFunction<R> DoubleFunction<R> | int long double | R |
参数分别为int、long、
double 类型返回值为R的函数
|
三、Lambda表达式的语法
Lambda在Java语言中引入了一个新的语法元素和操作符,这个操作符为"->",它将Lambda分为两个部分:
左侧:表达式的参数列表
右侧:表达式中所需执行的功能,即Lambda体(相当于接口的实现方法)
语法格式一:有参,无返回值
/**
* Consumer<T> 消费型接口
*/
@Test
public void test1() {
Consumer<String> consumer = (e) -> System.out.println(e);
consumer.accept("Hello Lambda");
}
语法格式二:有参,无返回值
/**
* Supplier<T> 供给型接口
*/
@Test
public void test2(){
List<Integer> numList = getNumList(10, () -> (int) (Math.random() * 1000));
numList.forEach(x -> System.out.println(x));
}
// 产生指定个数的整数,并放入到集合中
public List<Integer> getNumList(Integer num, Supplier<Integer> supplier) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i ++) {
list.add(supplier.get());
}
return list;
}
语法格式三:有参,有返回值
/**
* Function<T, R> 供给型接口
*
*/
@Test
public void test3() {
String s = strHandler(" 字符串前后去除空格 ", (x) -> x.trim());
System.out.println(s);
}
// 处理字符串
public String strHandler(String str, Function<String, String> function) {
return function.apply(str);
}
语法格式四:有参,返回boolean
/**
* Predicate<T> 断言型接口
*/
@Test
public void test4() {
boolean test = test(100, (num) -> {
if (100 % 4 == 0) {
return true;
} else {
return false;
}
});
System.out.println(test);
}
//判断整数能否被4整除
public boolean test(Integer num, Predicate<Integer> predicate) {
return predicate.test(num);
}