什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的。从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
3.1、语法定义
/**
- 定义函数式接口
- 接口上标注@FunctionalInterface 注解
*/
@FunctionalInterface
public interface ICollectionService {
/**
- 定义打印方法
*/
void print();
}
在Java8 以前,就已有大量函数式接口如下:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
Java8 新增加的函数接口在java.util.function 包下,它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:
序号
接口 & 描述
1
BiConsumer
2
BiFunction
3
BinaryOperator
4
BiPredicate
5
BooleanSupplier代表了boolean值结果的提供方
6
Consumer
7
DoubleBinaryOperator代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
8
DoubleConsumer代表一个接受double值参数的操作,并且不返回结果。
9
DoubleFunction
10
DoublePredicate代表一个拥有double值参数的boolean值方法
11
DoubleSupplier代表一个double值结构的提供方
12
DoubleToIntFunction接受一个double类型输入,返回一个int类型结果。
13
DoubleToLongFunction接受一个double类型输入,返回一个long类型结果
14
DoubleUnaryOperator接受一个参数同为类型double,返回值类型也为double 。
15
Function
16
IntBinaryOperator接受两个参数同为类型int,返回值类型也为int 。
17
IntConsumer接受一个int类型的输入参数,无返回值 。
18
IntFunction
19
IntPredicate:接受一个int输入参数,返回一个布尔值的结果。
20
IntSupplier无参数,返回一个int类型结果。
21
IntToDoubleFunction接受一个int类型输入,返回一个double类型结果 。
22
IntToLongFunction接受一个int类型输入,返回一个long类型结果。
23
IntUnaryOperator接受一个参数同为类型int,返回值类型也为int 。
24
LongBinaryOperator接受两个参数同为类型long,返回值类型也为long。
25
LongConsumer接受一个long类型的输入参数,无返回值。
26
LongFunction
27
LongPredicateR接受一个long输入参数,返回一个布尔值类型结果。
28
LongSupplier无参数,返回一个结果long类型的值。
29
LongToDoubleFunction接受一个long类型输入,返回一个double类型结果。
30
LongToIntFunction接受一个long类型输入,返回一个int类型结果。
31
LongUnaryOperator接受一个参数同为类型long,返回值类型也为long。
32
ObjDoubleConsumer
33
ObjIntConsumer
34
ObjLongConsumer
35
Predicate
36
Supplier
37
ToDoubleBiFunction
38
ToDoubleFunction
39
ToIntBiFunction
40
ToIntFunction
41
ToLongBiFunction
42
ToLongFunction
43
UnaryOperator
用手指在上面向左(右)滑动,可以看完整。
对于Java8中提供的这么多函数式接口,开发中常用的函数式接口有三个:Predicate,Consumer,Function。
3.2、函数式接口实例
3.2.1、Predicate
java.util.function.Predicate
使用Predicate接口实现字符串判空操作
@FunctionalInterface
public interface Predicate
/**
- Evaluates this predicate on the given argument.
*
- @param t the input argument
- @return {@code true} if the input argument matches the predicate,
- otherwise {@code false}
*/
boolean test(T t);
...
}
public static void main(String[] args) {
/**
- 借助Lambda 表达式实现Predicate test方法
*/
Predicate
/**
- 测试传入的字符串是否为空
*/
System.out.println(p01.test(""));
System.out.println(p01.test(" "));
System.out.println(p01.test("admin"));
}
测试结果:
3.2.2、Consumer
java.util.function.Consumer
使用Consumer实现集合遍历操作
@FunctionalInterface
public interface Consumer
/**
- Performs this operation on the given argument.
*
- @param t the input argument
*/
void accept(T t);
...
}
/**
- 借助Lambda表达式实现Consumer accept方法
*/
Consumer
if (null != collection && collection.size() > 0) {
for (Object c : collection) {
System.out.println(c);
}
}
};
List
list.add("诸葛亮");
list.add("曹操");
list.add("关羽");
// 遍历list 输出元素内容到控制台
c01.accept(list);
3.2.3、Function
java.util.function.Function
使用Function实现用户密码 Base64加密操作
@FunctionalInterface
public interface Function
/**
- Applies this function to the given argument.
*
- @param t the function argument
- @return the function result
*/
R apply(T t);
}
// 实现用户密码 Base64加密操作
Function
// 输出加密后的字符串
System.out.println(f01.apply("123456"));
加密后结果如下:
3.2.4、Supplier
java.util.function.Supplier
使用Supplier实现SessionFactory创建
@FunctionalInterface
public interface Supplier
/**
- Gets a result.
*
- @return a result
*/
T get();
}
/**
- 产生一个session工厂对象
*/
Supplier
return new SessionFactory();
};
s.get().info();