@FunctionalInterface注解
函数式接口在java中是指:有且仅有一个抽象方法的接口。
虽然知道怎么使用,但是没有搞懂使用场景,暂且记录下使用方法吧,不至于看到源码的时候不知所云。
要我自己写代码,我是想不起来这样用的,还做不到融汇贯通,先理解,记住,后续可能会悟到。
定义接口
@FunctionalInterface
public interface DeptDataPermissionRuleCustomizer {
/**
* 自定义该权限规则
* 1. 调用 {@link DeptDataPermissionRule#addDeptColumn(Class, String)} 方法,配置基于 dept_id 的过滤规则
* 2. 调用 {@link DeptDataPermissionRule#addUserColumn(Class, String)} 方法,配置基于 user_id 的过滤规则
*
* @param rule 权限规则
*/
void customize(DeptDataPermissionRule rule);
}
定义入参的类:
public class DeptDataPermissionRule {
public void addDeptColumn(String tableName, String columnName){
System.out.println(tableName + " add " + columnName);
}
public void addUserColumn(String tableName, String columnName){
System.out.println(tableName + " add " + columnName);
}
}
使用方法:
public class DataPermissionConfiguration {
public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() {
return rule -> {
// dept
rule.addDeptColumn("dept", "id");
// user
rule.addUserColumn("user", "id");
};
}
// 相当于下面的写法(为了方便理解)
public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer2() {
DeptDataPermissionRuleCustomizer customizer = new DeptDataPermissionRuleCustomizer() {
@Override
public void customize(DeptDataPermissionRule rule) {
rule.addDeptColumn("dept2", "id2");
}
};
return customizer;
}
public static void main(String[] args) {
// 使用场景
DataPermissionConfiguration dataPermissionConfiguration = new DataPermissionConfiguration();
dataPermissionConfiguration.sysDeptDataPermissionRuleCustomizer().customize(new DeptDataPermissionRule());
dataPermissionConfiguration.sysDeptDataPermissionRuleCustomizer2().customize(new DeptDataPermissionRule());
}
}
Consumer
Consumer<T>
包含方法:
void accept(T t):对给定的参数执行此操作
default Consumer < T > andThen(Consumer after):返回一个组合的Consumer,依次执行此操作,然后执行after操作
andThen源码
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
使用示例:
static void fun14(String name){
Consumer<String> con1 = (str) -> System.out.println(str+"-con1");
Consumer<String> con2 = (str) -> System.out.println(str+"-con2");
con1.accept(name);
con1.andThen(con2).accept(name);
}
输出:
jack-con1
jack-con1
jack-con2
Supplier
Supplier<T>
包含方法:
T get():获得结果,该方法不需要参数,他会按照某种实现逻辑(由Lambda表达式实现)返回一个数据
Supplier< T >接口也被称为供给型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会产生什么类型的数据供我们使用
static void fun15(){
String result = getSup(()->"a supplier");
System.out.println(result);
}static String getSup(Supplier<String> sup){
return sup.get();
}
输出:
a supplier
Function
Function<T,R>
常用方法:
R apply(T t):对类型为T的对象应用操作,并返回结果为R类型的对象
default< V >:Function andThen(Function after):返回一个组合函数,首先将该函数应用于输入,然后将after函数应用于结果
default < V > Function<V, R> compose(Function<? super V, ? extends T> before):返回一个组合函数,该函数首先将before函数应用于其输入,然后将此函数应用于结果
andThen源码
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
compose源码
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
示例:
static void fun16(){
String res = function("aaa",str -> str.length(),i -> i+"--func2");
System.out.println(res);
}
static String function(String str,Function<String,Integer> func1,Function<Integer,String> func2){
System.out.println(func1.apply(str));
return func1.andThen(func2).apply(str);
}
输出:
3
3--func2
Predicate常用方法
boolean test(T t):对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值
default Predicate< T > negate():返回一个逻辑的否定,对应逻辑非
default Predicate< T > and(Predicate<? super T> other):返回一个组合判断,对应短路与
default Predicate< T > or(Predicate<? super T> other):返回一个组合判断,对应短路或
isEqual(Object targetRef):测试两个参数是否相等
示例
tatic void fun17(){
boolean res = pred("bbb", str -> str.equals("aca"), str -> str.equals("bbb"));
System.out.println(res);
}
static boolean pred(String s, Predicate<String> pre1,Predicate<String> pre2){
return pre1.or(pre2).test(s);
}