如果函数式接口作为一个方法的参数,就以为着要方法调用方自己实现业务逻辑,常见的使用场景是一个业务整体逻辑是不相上下的,但是在某一个步骤有不同的逻辑,例如数据处理有不同的策略,如果有大量的if-els,或者switch-case还可以结合工厂模式消除这些分支代码。上代码
package com.dj.lambda;
import java.util.List;
import java.util.function.Function;
/**
* User: ldj
* Date: 2024/1/28
* Time: 14:57
* Description: 业务模板
*/
public class LambdaTemplate {
public Object execute(List<Integer> data, Function<List<Integer>, Object> function) {
connect();
request();
return invokeHandler(data, function);
}
//步骤一
private void connect() {
System.out.println("连接成功");
}
//步骤二
private void request() {
System.out.println("获取数据成功");
}
//步骤三 只有这里不同,处理数据有不同的处理策略 (假设apply方法有很多复杂的业务逻辑)
private Object invokeHandler(List<Integer> data, Function<List<Integer>, Object> function) {
return function.apply(data);
}
}
数据处理不同的策略:
package com.dj.lambda;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* User: ldj
* Date: 2024/1/28
* Time: 15:26
* Description: list元素去重
*/
public class DistinctHandler implements Function<List<Integer>, Object> {
@Override
public Object apply(List<Integer> integers) {
return integers.stream().distinct().collect(Collectors.toList());
}
}
package com.dj.lambda;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* User: ldj
* Date: 2024/1/28
* Time: 15:21
* Description: 统计list相同元素出现的次数
*/
public class StatisticsHandler implements Function<List<Integer>, Object> {
@Override
public Object apply(List<Integer> integers) {
return integers.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
}
}
package com.dj.lambda;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.stream.Collectors;
/**
* User: ldj
* Date: 2024/1/28
* Time: 15:42
* Description: No Description
*/
public class Test {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 1, 1, 4, 2, 5, 3, 6);
LambdaTemplate lambdaTemplate = new LambdaTemplate();
//1.像这种业务比较复杂,代码比较多的建议写实现类,比如策略类
System.out.println(lambdaTemplate.execute(list, new StatisticsHandler()));
System.out.println(lambdaTemplate.execute(list, new DistinctHandler()));
//2.如果是简单的,直接使用lambda表达式书写更为合适
System.out.println(lambdaTemplate.execute(list, els-> els.stream().sorted().collect(Collectors.toList())));
System.out.println(lambdaTemplate.execute(list, els -> els.stream().sorted().collect(Collectors.toCollection(LinkedHashSet::new))));
}
}