需求:在给定 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. Logstash 国内加速下载 转

    Logstash. 国内直接从官网(https://www.elastic.co)下载比较困难,需要一些技术手段.这里提供一个国内的镜像下载地址列表,方便网友下载. 找不到想要的版本?您可以访问 索引 ...

  2. ansible使用script模块在受控机上执行脚本(ansible2.9.5)

    一,ansible的script模块的用途 script 模块用来在远程主机上执行 ansible 管理主机上的脚本, 即:脚本一直存在于 ansible 管理主机本地, 不需要手动拷贝到远程主机后再 ...

  3. 通过SQL自动添加流水号

    通过SQL自动添加流水号 项目中往往有一些单据流水号或者流程流水号是希望通过新增一条记录后自动产生一个编号的,比如新增一条流程就自动根据当前日期自动添加该流程的流程流水号,下面介绍两种不同类型流水号通 ...

  4. Helium文档11-WebUI自动化-attach_file上传文件或图片

    前言 attach_file关键字根据官方介绍的作用是上传文件 入参介绍 def attach_file(file_path, to=None): """ :param ...

  5. 微信小程序的账号找回。

    之前注册过微信小程序,好久没用了,马上要开发微信小程序了,我今天登陆了一下突然发现 然后点击账号找回,按照流程同意点击下一步,到第二部时要输入搜索框里的提示. 这时的我早已忘了,百度搜了一下如何找回原 ...

  6. (Pixel2PixelGANs)Image-to-Image translation with conditional adversarial networks

    Introduction 1. develop a common framework for all problems that are the task of predicting pixels f ...

  7. SpringBoot + Swagger Demo

    Swagger是什么? Swagger 是一个规范且完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.  Swagger 的目标是对 REST API 定义一个标准且和语 ...

  8. 【转】Setting up SDL Extension Libraries on Visual Studio 2010 Ultimate

    FROM:http://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/windows ...

  9. 05 . Go+Vue开发一个线上外卖应用(Session集成及修改用户头像到Fastdfs)

    用户头像上传 功能介绍 在用户中心中,允许用户更换自己的头像.因此,我们开发上传一张图片到服务器,并保存成为用户的头像. 接口解析 在用户模块的控制器MemberController中,解析头像上传的 ...

  10. 微信小程序获取高宽uniapp

    代码片段 <template> <view> <view class="text" id="w">补充文字</view ...