JAVA中函数式接口-------Function ,BiFunction计算转换接口

简介: JAVA中函数式接口-------Function ,BiFunction计算转换接口

函数式接口中Function ,BiFunction计算转换接口是什么


Function和BiFunction属于函数式接口,那么什么是函数式接口呢?


函数式接口


只有一个抽象方法的接口我们称之为函数接口。


     JDK的函数式接口都加上了@FunctionalInterface注解进行标识。但是无论是否加上该注解只要接口中只有一个抽象方法,都是函数式接口。


为什么要用函数式接口


  • 代码简洁,开发快速
  • 可以使用极简的lambda表达式实例化接口
    其实就是为了适应转化成lambda表达式,写成具体的方法也可以,但是就是多要多写一些代码,引入函数式接口就是为了配合转化成极简lambda表达式简化代码


怎么使用Function ,BiFunction计算转换接口

Function


举例如下:一个测试字符串长度的例子

没转化之前


public class function {
    static Function<String, Integer> strLen = new Function<String, Integer>() {
        @Override
        public Integer apply(String s) {
            int length = s.length();
            return length;
        }
    };
    public static void main(String[] args) {
        System.out.println("Function 示例, 字符串长度: " + strLen.apply("Hello"));
    }
}

转化之后


public class function {
    static Function<String, Integer> strLen = s -> {
        int length = s.length();
        return length;
    };
    public static void main(String[] args) {
        System.out.println("Function 示例, 字符串长度: " + strLen.apply("Hello"));
    }
}

可以再简化


public class function {
    static Function<String, Integer> strLen = String::length;
    public static void main(String[] args) {
        System.out.println("Function 示例, 字符串长度: " + strLen.apply("Hello"));
    }
}


测试结果:



上面这个例子其实没有必要创建一个接口来返回字符串的长度,这是简化操作,例如下面想将一个过滤桶中的数据进行转化封装,那么你大可写一个转化函数,加上参数和返回值,也可以利用JAVA8中封装好的函数式计算转换接口Function进行编写,如下


private Function<Filters , LinkedHashMap<String, Long>>  RESULT_CONVENT = new Function<Filters, LinkedHashMap<String, Long>>() {
        @Override
        public LinkedHashMap<String, Long> apply(Filters term) {
            LinkedHashMap<String, Long> result = new LinkedHashMap<>();
            for (Filters.Bucket temp : term.getBuckets()) {
                MultiBucketsAggregation statisticTimeTerm = temp.getAggregations().get("Time");
                for (MultiBucketsAggregation.Bucket timeTemp : statisticTimeTerm.getBuckets()) {
                    result.put(timeTemp.getKeyAsString(), timeTemp.getDocCount());
                }
            }
            return result;
        }
    };


转化成lambda表达式后


private Function<Filters , LinkedHashMap<String, Long>>  RESULT_CONVENT = term -> {
        LinkedHashMap<String, Long> result = new LinkedHashMap<>();
        for (Filters.Bucket temp : term.getBuckets()) {
            MultiBucketsAggregation statisticTimeTerm = temp.getAggregations().get("Time");
            for (MultiBucketsAggregation.Bucket timeTemp : statisticTimeTerm.getBuckets()) {
                result.put(timeTemp.getKeyAsString(), timeTemp.getDocCount());
            }
        }
        return result;
    };


这样写的目的就是转化成lambda表达式,转化为函数式编程思想,熟悉函数式接口

同样的下面的BiFunction功能更加强大,可以两个参数的计算转换


BiFunction两个参数的计算转换


public class function {
    static BiFunction<String, Integer, Boolean> expectLength = (s, num) -> s.length() == num;
    public static void main(String[] args) {
        System.out.print("BiFunction 示例, 字符串长度是否符合预期? " + expectLength.apply("21yi", 4));
    }
}


测试结果


相关文章
|
6天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
7天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
21 1
|
12天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
40 4
|
11天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
32 2
|
15天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
17天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
17天前
|
Java 测试技术 API
Java零基础-接口详解
【10月更文挑战第19天】Java零基础教学篇,手把手实践教学!
17 1
|
15天前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
23 0
|
Java
Java接口和抽象类
Java接口和抽象类
87 0
|
3月前
|
设计模式 Java
【惊天揭秘】Java编程绝技大曝光:接口、抽象类、静态类与非静态类的神秘面纱终被揭开!
【8月更文挑战第22天】Java支持面向对象编程,通过接口、抽象类、静态类(如枚举与工具类)及普通类实现设计原则。接口定义行为规范,允许多重继承;抽象类含未实现的抽象方法,需子类完成;静态类常为工具类,提供静态方法;普通类则实例化对象。恰当运用这些结构能提升程序质量。
39 2

热门文章

最新文章

  • 1
    Error: Package awesomeProject contains more than one main function Consider using File kind instead
    60
  • 2
    深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析
    150
  • 3
    【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
    86
  • 4
    DataWorks操作报错合集之DataWorksUDF 报错:evaluate for user defined function xxx cannot be loaded from any resources,该怎么处理
    104
  • 5
    DataWorks产品使用合集之在 DataWorks 中,Function Studio 功能如何解决
    75
  • 6
    DataWorks产品使用合集之在 DataWorks 中的 ODPS UDF(User-Defined Function,用户自定义函数)中,支持不定长参数如何解决
    72
  • 7
    Serverless 应用引擎操作报错合集之在阿里函数计算中,函数执行超时,报错Function time out after如何解决
    62
  • 8
    Serverless 应用引擎操作报错合集之在阿里函数计算中,云函数怎么一直报错Function instance exited unexpectedly(code 1, message:operation not permitted) with start command 'php server.php '.如何解决
    145
  • 9
    Serverless 应用引擎操作报错合集之阿里函数计算中我打开sd时遇到错误,信息为"Function instance exited unexpectedly(code 1, message:operation not permitted) with start command ' '."如何解决
    297
  • 10
    Serverless 应用引擎操作报错合集之阿里函数计算中配置完fc,出现‘Function instance exited unexpectedly(code 1, message:operation not permitted) with start command 'npm run start '. 报错如何解决
    201