java【function】

本贴最后更新于 1458 天前,其中的信息可能已经时过境迁

函数式编程/lambda 表达式

关于为什么需要学习函数式编程,什么是函数式编程,之前在学习 javase 的时候,学到关于 lambda 表达式对一些知识,但是时间消磨了我,最近在做项目分析别人代码的时候,看到一大堆的 function 的方法使用,使得我引起了重视。

函数式编程:面向结果,对过程不在乎,例如实现的细节之类的。

一般的我们自己代码(命令式编程):面向过程编程。

代码演示

@Test public void whyisfunction() { /** * 命令式编程 */ int[] nums = {12,10,13,14,78}; //过程 Integer max =Integer.MIN_VALUE; for (int i :nums) { if(i> max) { max = i; } } System.out.println(String.format("【命令式】%s", max)); /** * 函数式编程 */ int asInt = IntStream.of(nums).max().getAsInt(); System.out.println(String.format("【函数式】%s", asInt)); }

优势在于函数式编程可以快速是一个多线程,并行等,效率更高

我们以创建一个线程为实例的方式,进行演示

@Test public void runableTest() { /** * 命令式写法 */ new Thread(new Runnable() { @Override public void run() { System.out.println("【命令式】启动一个线程实例"); } }).start();; /** * 配置lambda表示写法 */ new Thread(()->System.out.println("【函数式】启动一个线程实例")).start(); }

可能现在还不能很好的看出来,我们换一种方式写出来

@Test public void runableTest2() { /** * 命令式写法 */ Runnable runnable = new Runnable() { @Override public void run() { System.out.println("【命令式】启动一个线程实例"); } }; new Thread(runnable).start(); /** * 配置lambda表示写法 */ Runnable runnable2 = ()->System.out.println("【函数式】启动一个线程实例"); Runnable runnable3 = ()->System.out.println("【函数式】启动一个线程实例"); System.out.println(runnable2 == runnable3); //输出为false new Thread(runnable2).start(); }

从上面实例就可以看出来,对于 lambda 表示而言,他并不关注你实现的是哪个方法,它实现的就是一个接口里面的一个不带参数的方法,返回的就是指定接口实例。说到这里,小伙伴应该会想到为什么之前在 Thread 的时候,它可以使用 lambda,因为 Thread 这个接口符合 function 函数规则【定义为接口,并且只有一个抽象方法】,所以当我们使用()->System.out.println("【函数式】启动一个线程实例"),就能够找到返回的实例找到实现方法,如果有多个话,就可能出现不知道找谁了。

lambda 的案例使用

interface IMoneyout{ String format2(int i); } class IMyMoney { private int money =99999; public IMyMoney(int money) { this.money = money; } public void getresult(IMoneyout iMoneyout){ System.out.println(iMoneyout.format2(money)); } } public class function02 { @Test public void test01() { IMyMoney im=new IMyMoney(99999); ArrayList<Integer> arrayList = new ArrayList<Integer>(); im.getresult(hax->{ arrayList.add(hax); return arrayList.toString(); }); im.getresult(hax->new DecimalFormat("#,###").format(hax)); } }

输出接口为

[99999],

99,999

使用 function 函数接口操作,Function<Integer, String>

class IMyMoney { private int money =99999; public IMyMoney(int money) { this.money = money; } public void getresult(Function<Integer, String> iMoneyout){ System.out.println(iMoneyout.apply(money)); } } public class function02 { @Test public void test01() { IMyMoney im=new IMyMoney(99999); ArrayList<String> arrayList = new ArrayList<String>(); /** * 使用函数接口,可以进行链式操作 */ Function<Integer, String> iMoneyout = hax->new DecimalFormat("#,###").format(hax); im.getresult(iMoneyout.andThen(s->{ arrayList.add("人民币"+s); return arrayList.toString(); })); } }

基本的函数接口,使用代码的形式为大家解释,代码中都存在注解。

public class function03 { class person{ private String name; private char sex; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public person(String name, char sex, Integer age) { super(); this.name = name; this.sex = sex; this.age = age; } public person(String name) { super(); this.name = name; } public person() { super(); } @Override public String toString() { return "person [name=" + name + ", sex=" + sex + ", age=" + age + "]"; } } @Test public void test01() { //断言函数 Predicate<Integer> predicate = i->i>=10; System.out.println(predicate.test(10)); //消费者->消费一个数据 Consumer<String> consumer = i ->System.out.println(i); consumer.accept("消费者函数"); //function函数->输入输出 Function<Date, String> function = hax-> new SimpleDateFormat("yyyy-MM-ss:HH:mm:ss").format(hax); System.out.println(function.apply(new Date())); //一元函数->输入和输出是一样的类型 UnaryOperator<function03.person> uOperator = hax -> { if(hax!=null && hax.getAge()<18 && "女".equals(hax.getSex()) ) { hax.setAge(18); } return hax; }; System.out.println(uOperator.apply(new function03.person("ff",'女',19)).toString()); /** * 二个输入,一个输出函数 */ function03.person person = new function03.person(); BiFunction<function03.person, String, function03.person> biFunction = (hax,haxstring)-> new function03.person(haxstring); System.out.println(biFunction.apply(person, "yy"));; /** * 提供者 */ Supplier<String> supplier = () -> new function03.person("supplier").toString(); System.out.println(supplier.get()); /** * 二元函数->参数2个,传入的参数相同,返回的参数也相同 */ BinaryOperator<String> binaryOperator = (hax1,hax2)->new StringBuilder(hax1).append(hax2).toString(); System.out.println(binaryOperator.apply("二元", "函数")); /** * 对于基本类型来说,function提供了一些基本的类型实现,不需要在写泛型 */ // IntPredicate predicate2 = i ->i >=10; System.out.println(predicate2.test(10)); //string类型的没有 IntConsumer consumer2 = i ->System.out.println(i); consumer2.accept(10); } }

返回结果为

true
消费者函数
2021-04-53:10:13:53
person [name=ff, sex=女, age=19]
person [name=yy, sex= , age=null]
person [name=supplier, sex=, age=null]
二元函数
true
10

总而言之使用函数式的编程方式,发现我们不在去关注你需要实现的是什么方法,关注点只在于,你需要什么类型参数,返回值就可以,我们在 lambda 表达式中写入自己想实现的操作,可以用法等一系列的操作进行实现,然后将结果拿到进行返回操作,方便弄好实现,并且我们可以通过自己自定义的函数接口,对制定的一些方法进行标准化。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3198 引用 • 8215 回帖
  • function
    3 引用 • 16 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 209 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 1 关注
  • danl
    165 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 141 回帖 • 1 关注
  • Word
    13 引用 • 40 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    95 引用 • 901 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 461 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 668 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    44 引用 • 208 回帖 • 3 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    187 引用 • 318 回帖 • 255 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    298 引用 • 763 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 7 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖 • 1 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 197 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 224 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 1 关注
  • OpenCV
    15 引用 • 36 回帖
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    588 引用 • 3538 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 317 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 759 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖 • 4 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 246 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 547 关注