需求:在给定 List 集合中,需根据不同的算法规则,选取计算方式并返回结果;

例如:[1, 2, 3, 4, 5] List 集合中都是 Integer 类型数据,根据提供的算法规则,sum 求和,min 求最小值,max 求最大值等;

使用场景:需要根据指定 key,选取不同的逻辑处理方式;

一、使用枚举类实现

(1)定义枚举类DataEnum,需实现指定的计算接口,根据不同的算法规则【使用枚举类中默认的 name 属性】,来选取不同的算法计算方式;

(2)代码如下:

// 计算方式接口定义
public interface Icalculate { // 计算方式
Integer calculate(List<Integer> datas); } // 定义枚举类,实现接口
public enum DataEnum implements Icalculate { SUM{
@Override
public Integer calculate(List<Integer> datas) {
return datas.stream().reduce(0, (element1, element2) -> element1 + element2);
}
}, MIN{
@Override
public Integer calculate(List<Integer> datas) {
Optional<Integer> min = datas.stream().min(Comparator.comparingInt(o -> o));
return min.orElse(null);
}
}, MAX{
@Override
public Integer calculate(List<Integer> datas) {
Optional<Integer> max = datas.stream().max(Comparator.comparingInt(o -> o));
return max.orElse(null);
}
}; // 根据算法规则,获取指定的计算方式【挪用了枚举类继承Enum中的name属性】
public static DataEnum of(String name) {
Optional<DataEnum> dataEnum = Arrays.stream(DataEnum.values()).filter(element -> element.name().equalsIgnoreCase(name)).findAny();
return dataEnum.orElse(null);
} } 枚举类实现

(3)测试样例及结果

public class DataEnumTest {

    public static void main(String[] args) {
DataEnum dataEnum = DataEnum.of("max");
if (!Objects.isNull(dataEnum)) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
System.out.println("max = " + dataEnum.calculate(list));
}
} }
结果:max = 5

测试样例及结果

二、使用Map结构结合Function实现【常用】

(1)定义FunctionUtil工具类,结合Java8的Function函数式接口实现;

(2)代码实现:

public class FunctionUtil {

    // 定义Map结构,key: 算法规则,value: 存放指定的计算方式
private static Map<String, Function<List<Integer>, Integer>> calculateMap = new HashMap<>(); // 静态代码块,初始化Map结构,定义指定算法规则的计算方式
static {
calculateMap.put("SUM", list -> list.stream().reduce(0, Integer::sum));
calculateMap.put("MIN", data -> data.stream().min(Comparator.comparingInt(o -> o)).orElse(null));
calculateMap.put("MAX", data -> data.stream().max(Comparator.comparingInt(o -> o)).orElse(null));
}
}

(3)测试样例和结果:

public class Test {

    public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Integer min = FunctionUtil.calculateMap.get("MIN").apply(list);
Integer max = FunctionUtil.calculateMap.get("MAX").apply(list);
Integer sum = FunctionUtil.calculateMap.get("SUM").apply(list);
System.out.println("min = " + min + ", max = " + max + ", sum = " + sum); } }
结果:min = 1, max = 5, sum = 15

测试样例及结果

三、Java8 的函数式接口之 Function 使用

(1)常见的函数式接口集合,供参考:详解JAVA8函数式接口{全}

1、Consumer<T>   :消费型接口    void accept(T t);

2、Supplier<T>   :供给型接口    T get();

3、Function<T,R> :函数型接口    R apply(T t);

4、Predicate<T>  :断言型接口    boolean test(T t);

(2)举例使用 Function 作为参数使用

public class FunctionTest {

    // 提供一个 Function 入参泛型方法【适用于不同的数据类型】
private static <T, R> R calculate(T t, Function<T, R> function) {
return function.apply(t);
} public static void main(String[] args) {
Function<List<Integer>, Integer> sumFunc = list -> list.stream().reduce(0, Integer::sum);
Integer sum = FunctionTest.calculate(Arrays.asList(1, 2, 3, 4, 5), sumFunc); Function<List<Integer>, Integer> maxFunc = list -> list.stream().max(Comparator.comparingInt(o -> o)).orElse(null);
Integer max = FunctionTest.calculate(Arrays.asList(1, 2, 3, 4, 5), maxFunc); Function<List<Integer>, Integer> minFunc = list -> list.stream().min(Comparator.comparingInt(o -> o)).orElse(null);
Integer min = FunctionTest.calculate(Arrays.asList(1, 2, 3, 4, 5), minFunc); System.out.println("sum = " + sum + ", min = " + min + ", max = " + max);
} } 结果:sum = 15, min = 1, max = 5

使用函数式接口作为形参时,会为方法的封装提供了很大的便利性,不会受到类型的约束和限制,使得方法的使用场景更加广泛和可扩展性;

Map结合Function函数式接口的巧妙之处的更多相关文章

  1. java8学习之Function与BiFunction函数式接口详解

    Function接口: 上次中已经使用了Function的apply()方法,但是在这个接口中还存在三个具体实现的方法,如下: 下面来仔细的将剩下的方法学习一下: compose(): 首先来读一下该 ...

  2. Java 8中一些常用的全新的函数式接口

    这一篇属于菜鸟级博客,只是介绍了一些在Java 8中新出现的一些很有用的接口,通过一些简单的例子加以说明,没有深入地阐述. 函数式接口 什么是函数式接口? 函数式接口,@FunctionalInter ...

  3. java8中使用函数式接口

    使用函数式接口 Predicate @FunctionalInterface interface Predicate<T>{ boolean test(T t); } public sta ...

  4. 8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理

    我是风筝,公众号「古时的风筝」.一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  5. 第46天学习打卡(四大函数式接口 Stream流式计算 ForkJoin 异步回调 JMM Volatile)

    小结与扩展 池的最大的大小如何去设置! 了解:IO密集型,CPU密集型:(调优)  //1.CPU密集型 几核就是几个线程 可以保持效率最高 //2.IO密集型判断你的程序中十分耗IO的线程,只要大于 ...

  6. 用好JAVA中的函数式接口,轻松从通用代码框架中剥离掉业务定制逻辑

    大家好,又见面了. 今天我们一起聊一聊JAVA中的函数式接口.那我们首先要知道啥是函数式接口.它和JAVA中普通的接口有啥区别?其实函数式接口也是一个Interface类,是一种比较特殊的接口类,这个 ...

  7. Java8内置的函数式接口

    JDK 1.8 API 包含了很多内置的函数式接口.其中就包括我们在老版本中经常见到的 Comparator 和 Runnable,Java 8 为他们都添加了 @FunctionalInterfac ...

  8. JAVA8之函数式接口

    由于JDK8已经发布一段时间了,也开始逐渐稳定,未来使用JAVA语言开发的系统会逐渐升级到JDK8,因为为了以后工作需要,我们有必要了解JAVA8的一些新的特性.JAVA8相对JAVA7最重要的一个突 ...

  9. java8学习之Supplier与函数式接口总结

    Supplier接口: 继续学习一个新的函数式接口--Supplier,它的中文意思为供应商.提供者,下面看一下它的javadoc: 而具体的方法也是相当的简单,就是不接受任何参数,返回一个结果: 对 ...

随机推荐

  1. linux 压缩命令 zip

    1.zip命令 例如:zip -r mysql.zip mysql 该句命令的含义是:将mysql文件夹压缩成mysql.zip zip -r abcdef.zip abc def.txt 这句命令的 ...

  2. 华为路由器配置OSPF

    OSPF是什么 OSPF(Open Shortest Pass First,开放最短路径优先协议),是一个最常用的内部网管协议,是一个链路状态协议. 使用场景:适用于运营商.政府机构等大型网络中多节点 ...

  3. Java进阶专题(十五) 从电商系统角度研究多线程(下)

    前言 ​ 本章节继上章节继续梳理:线程相关的基础理论和工具.多线程程序下的性能调优和电商场景下多线程的使用. 多线程J·U·C ThreadLocal 概念 ​ ThreadLocal类并不是用来解决 ...

  4. MySQL备份和恢复[4]-xtrabackup备份工具

    xtrabackup工具介绍 Percona 公司 官网:www.percona.com percona-server InnoDB --> XtraDB Xtrabackup备份工具 perc ...

  5. Java IO相关使用

    date: 2020-06-14 14:42:22 updated: 2020-08-21 17:35:45 Java IO相关使用 1. 文件 创建 File 对象的三种方式 一个路径名:File( ...

  6. git 出现 error: bad signature fatal: index file corrupt

    一次大改版,提交了很多代码,但再次提交提交不了,也拉不下来仓库的代码 提示error bad signature fatal: index file corrupt 在项目有.git这同级打开Git ...

  7. 分四个阶段学习python并找到一份好工作

    第一阶段 关注公众号"轻松学编程"了解更多. 详细学习资料 需要时间一个月. 1.python概念 ​ python是一种解释型.面向对象.动态数据类型的高级程序语言. ​ 理解: ...

  8. Django中间件(Middleware)处理请求

    关注公众号"轻松学编程"了解更多. 1.面向切面编程 切点(钩子) 切点允许我们动态的在原有逻辑中插入一部分代码 在不修改原有代码的情况下,动态注入一部分代码 默认情况,不中断传播 ...

  9. C#4语法新特性

    C#4,.NET Framework 4.0, Visual Studio 2010  C#4.0新引进的语法基于.Net Framework 4.0.主要引进的语法:动态类型,命名参数.可选参数,优 ...

  10. How to resolve DynamicHeight problem in Morphx report[X++]

    For set dynamic height for controls in report on executeSection method: method 01 real maxHeight; st ...