范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

JAVA新特性的入场券函数式接口

  从Java8的"新"特性说起
  说到Java中的函数式编程,就不得不说到Java8中引入的lambda表达式、stream API等特性。它们与函数式接口一起支撑起了Java的函数式编程。
  函数式编程有较高的可读性与更好扩展性。而也正因为此,在后续版本Java的各种API中,充斥着各种通过函数式接口进行能力扩展的功能。所以,可以说理解函数式接口(编程)是进行后续高级特性学习的第一步。
  本文将从概念上引入函数式接口的意义,以及着重针对Java8新提供函数式接口进行功能汇总,并不对lambda表达式与stream API做过多的展开。 数学概念-范畴(Category Theory)
  数据概念太过晦涩,但是可以帮助你理解一些问题出现的原因与原理。可以说函数式编程的数学起源就是范畴概念。
  一句话总结的话: 范畴就是使用"箭头"连接的"物体"。
  物体表示的是可以转化的实体,而箭头是物体的互相转化"关系"。举个例子来说,如果A可以通过*3变换转化为B,而B可以通过/2变成C,如:
  A —*3—> B —/2—>C
  A、B、C与两个箭头共同构成了一个范畴,所以我们可以说1、3、1.5与2、6、3与4、12、6与...他们是一个范畴。而A、B、C间箭头的这种转化关系的学名被称为"态射"(morphism)。而在范畴的概念中,B与C因为都是可以从A通过一个或者多个态射转化而来的,所以认为他们是A的不同状态的"变形"(transformation)。
  我们可以发现,范畴包含两个部分: 是让不同实体互相转化的"态射"集合 可以从某一实体"变形"的实体集合
  我们不难发现,范畴中的"态射"便是我们所关心的"函数"概念。
  范畴中的函数是为了表达数学运算方式,所以本质上是进行求解的数学方法。而函数式编程则是在计算机中通过函数接口的方式描述实体间的转化,从而获得范畴中的的另一个"变形",显而易见:
  函数式编程实际上是用编程的方式在对象间进行的一种数学运算。
  那么我们就可以理解关于函数式接口的很多涉及,举几个例子的话: 函数式接口中应有一个方法。因为是为了表示一个映射关系。 函数式接口方法中不有额外副作用。函数只进行实体的转换,而非其他其他应用逻辑。 函数式接口
  由于函数是用来描述一次实体的转变的,所以 函数式接口中只有一个抽象方法 。但由于Java的继承关系,这个"只有一个"的概念实际是是排除了Object的相关方法的。
  满足这个条件的就可以作为函数式接口进行使用,但为了后续的开发导致歧义,你可以用@FunctionInterface注解标记到接口上,用于表明这个接口只应该有一个抽象方法,如果不满足这个条件,则这个问题会在编译的时候就暴露出来。
  尽管Java的函数式编程是在Java8才支持的,但是之前的版本中就有很多函数接口,其中常用的有: java.lang.Runnable java.util.concurrent.Callable java.util.Comparator java.io.FileFilter java.nio.file.PathMatcher
  这些接口本身就满足上述条件,同时在Java8中也为这些接口加上了@FunctionInterface注解特别标示。 Java8新增的函数式接口都有啥
  在Java8中为了支持Lambda表达式与函数式编程,特别新增了一批函数式接口,他们的包路径为:
  java.util.function
  该包路径下一共43个类,我将它划分为以下几类: 基础类型4种 入参扩展3种 出入类型相同省略2种 基础类型扩展34种 基础类型
  基础类型定义有以下几种:
  接口
  入参
  返回
  说明
  Predicate
  T
  boolean
  断言
  Consumer
  T
  -
  消费一个数据
  Function
  T
  R
  从T映射到R
  Supplier
  -
  T
  提供一个数据
  之所以说是基本定义,是因为其他的定义都是围绕在这些概念的基础上进行扩展的。
  其中 Predicate 我认为可以算是Function的一种特例变形,可以认为是Function。而单独地进行封装是为了进行语义增强。其中源码上的说明也是如此:
  Represents a predicate (boolean-valued function) of one argument.
  那么你会发现,剩下来的三种基础类型Supplier、Function、Consumer,所对应了一个范畴实体的开始、范畴实体与实体的态射、范畴实体的结束。 入参扩展
  入参扩展就是将具有入参的基本类型的参数个数扩展为了两个: BiConsumer BiFunction BiPredicate
  原则上,多参数的扩展是可以利用"科尔化"来处理的,但是由于两个参数的使用场景实在是太多了,比如处理Map相关的内容,所以特别的将两个入参的封装为了单独的接口。 出入类型相同省略
  出入类型相同省略是对,Function与BiFunction的一种特殊的省略。由于在数据处理的时候存在大量使用相同数据类型进行处理的情况,例如: reduce操作。所以特别地提供了入参与出参相同的接口: UnaryOperator(单个入参) BinaryOperator(两个入参)
  出入参数类型相同,则可以简化泛型定义的过程。 基础类型扩展
  基础类型扩展主要是针对常用的基础类型int、long、double类型进行了接口定义,三种类型各11个,以Int为例子: IntBinaryOperator IntConsumer IntFunction IntPredicate IntSupplier IntUnaryOperator ObjIntConsumer IntToDoubleFunction IntToLongFunction ToIntBiFunction ToIntFunction
  可以看到这11个接口又可以分为三种: 入参推定,对于一种入参类型的接口,提供类型为int的接口。是Int开头的接口(不包含IntTo)。特别的,ObjIntConsumer是一个入参为int的BiConsumer。 类型转换的Function,为了向其他基础类型进行转换的Function。是IntTo开头的接口 出参推定,对于出参的接口,提供类型为int的接口。是ToInt开头的接口。
  除此之外为了boolean类型单独提供了BooleanSupplier接口。
  基础类型扩展主要是避免在处理常用类型的函数式编程或者流编程的时候产生频繁的包装类转换。所以单独提供了一组接口,用于提高性能。 小例子
  我们在这里写一个包含主要基本类型的小例子: public class FunctionDemo {      public int calculate(int num ){         return num*2;     }      public String show(){         return "类方法引用--提供了信息。";     }      public static void main(String[] args) {         predicate();         consumer();         function();         supplier();     }      public static void predicate() {         System.out.println("-- Test for predicate --");         Predicate predicate = i -> i > 0;         System.out.println("predicate test 6 : " + predicate.test(6));         System.out.println("predicate test -1 : " + predicate.test(-1));         IntPredicate intPredicate = i -> i > 0;         System.out.println("intPredicate test 6 : " + intPredicate.test(6));         System.out.println("intPredicate test -1 : " + intPredicate.test(-1));     }      public static void consumer(){         System.out.println("-- Test for consumer --");         Consumer consumer = System.out::println;         consumer.accept("静态方法引用 - 我是一个消费者");     }      public static void function(){         System.out.println("-- Test for function --");         Function function = x ->  x*2;         System.out.println("Function 新数字为:" + function.apply(23));         FunctionDemo demo = new FunctionDemo();         IntUnaryOperator intFunction = demo::calculate;         System.out.println("实例方法引用 - IntUnaryOperator - 新数字为:" + intFunction.applyAsInt(23));     }      public static void supplier(){         System.out.println("-- Test for supplier --");         Supplier supplier = FunctionDemo::new;         System.out.println(supplier.get());         final Function show = FunctionDemo::show;         System.out.println(show.apply(new FunctionDemo()));     }      @Override     public String toString() {         return "构造函数方法引用 - 对象打印了自己";     } }
  这个例子的执行结果如下: -- Test for predicate -- predicate test 6 : true predicate test -1 : false intPredicate test 6 : true intPredicate test -1 : false -- Test for consumer -- 静态方法引用 - 我是一个消费者 -- Test for function -- Function 新数字为:46 实例方法引用 - IntUnaryOperator - 新数字为:46 -- Test for supplier -- 构造函数方法引用 - 对象打印了自己 类方法引用--提供了信息。
  这个例子分别展示了 几个基本函数式接口的使用方法 int、long、double的基础数据类型函数式接口的用法 函数式接口方法引用方法
  其中如同日志中描述的一样,函数式接口方法引用方法有4种: 静态方法引用 非静态 实例方法引用 非静态 类方法引用 构造函数方法引用 最后
  Java8中的函数式编程是一种数学思想的程序化,而函数接口则是具体的执行单位。函数式接口以Consumer、Supplier、Function三个借口为核心进行功能扩展,以满足不同场景的便捷使用。
  特别的,本文没有介绍函数式接口中的andThen、compose等方法,后续遇到咱们再续。

谣言终结i99900KF闲鱼偷跑,价格便宜,体质还好近一年来,英特尔14nm的产能低下导致了8代和9代酷睿处理器的价格居高不下,为了避免更多的用户转投竞争对手AMD的怀抱,英特尔早前就计划推出屏蔽了核显的9代酷睿处理器,但是早前曾有大股东是联想控股,证监会问拉卡拉为什么没实控人?支付之家网(ZFZJ。CN)终于,饱受争议的拉卡拉成功过会,距离A股近在咫尺。拉卡拉IPO申请获通过!拉卡拉由有道创投孙陶然雷军在2005年共同出资设立,最初靠提供信用卡还款水电煤Nginx动静分离与负载均衡的实现一前提企业中,随着用户的增长,数据量也几乎成几何增长,数据越来越大,随之也就出现了各种应用的瓶颈问题。问题出现了,我们就得想办法解决,一般网站环境,均会使用LAMP或者LNMP,而华为EMUI9。1系统公布新设计GPUTurbo3。0IT之家3月26日消息华为P30系列新机发布会已经在法国巴黎正式拉开帷幕,除了华为P30和华为P30Pro两款新机之外,华为还正式公布了EMUI9。1系统。据华为介绍,EMUI9。超人气的米家锁真的物有所值?你想知道的都在这里!前言近期小米推出了小米米家智能门锁,一经开售就秒售罄,更是夺得了小米众筹史金额第一的成绩,这把售价1299元的千元级门锁究竟有什么魔力?它与其他智能门锁相比又有哪些过人之处?它的用苹果年度最佳App,有了它你可以把手机里的修图App都删了如果不是因为入选2018AppStore年度精选APP,可能很多人不会留意马卡龙玩图这个名字看起来不是很正经的手机P图软件。拿下了本土苹果App奥斯卡大奖之后的马卡龙玩图官微,到现华为新机发布会都亮相了什么?硬件真不少在苹果暖场之后,华为3月27日发布会推出了不少的硬件,整场发布会惊喜不断。那么,到底都发布哪些神奇的产品呢?我们不妨来看看。华为P30系列华为P30系列是整场发布会的重点,手机共有德国超市麦德龙将退出中国市场你怎么看?近日,路透社报道援引知情人士的话称,麦德龙已通过招标的方式开始出售其在中国的业务,业务估值高达30亿美元。而交易的估值在1520亿美元之间。对于潜在参与的买家,报道称,包括苏宁控股打败三星,一年狂卖200亿的非洲手机之王,竟要在中国上市!小米之后,又一个中国手机即将上市!惊奇的是,国内90的人甚至还没见过它!英雄不问出处,它称得上是华为小米OV之外,另一场传奇!逆天的四卡四待能解决黑人自拍难题有墙的地方就有它的广告一天400人离职?京东员工称扛不住995董明珠我钱不多但很幸福京东被曝最高峰时一天400多人离职,员工称扛不住995据8号楼工作室,一位最近离职的前京东员工赵凡(化名)表示,自己办理离职的时候和人力聊天,京东峰值一天离职将近400人。提及离职华为P30Pro震撼发布京东方副总确认采用自家柔性屏昨天晚间,华为在法国巴黎正式发布了旗下P系列旗舰手机P30和P30Pro。无论是外观设计还是逆天的拍照实力,都让全球的用户们叹为观止。此次P系列依旧选择采用了双机型的策略,P30P
老美宣布监管期正式结束!跪下来的中兴真的站起来了吗?众所周知,对于同样都被老美限制的中兴和华为,大家对其评价并不相同。有很多人对当初中兴妥协缴纳罚款的事情颇为不满。他们用了一个很刺眼的词语来形容当时的中兴跪下来的中兴。在这里我们暂且共享单车成为一种新公害共享单车提供了便利性的同时,也成为一种公害,这个公害的最大思想就是浪费。同时,基于共享单车的这种思想商业模式也浓缩成一个基本资本市场思维模式一边提供便利性服务,一边最大限度的撸韭菜比特币的采用意味着什么?比特币的实际采用水平比许多人想象的要低得多,这意味着它的潜在优势要高得多。美国总统拜登9日发布了有关数字资产的行政命令。奥巴马政府的一名高级官员在评论该命令时表示,据报道,约400Vivo官方预热XFlod折叠新机,多款新品4月发布,包括平板Vivo官方开始预热XFold折叠手机,这款手机的配置基本都曝光了。外屏采用6。53英寸居中打孔,120Hz刷新率,内屏采用8英寸打孔,2K分辨率,机身厚度6。28mm。内外屏都支商汤科技2021年报发布全年营收47亿元研发与商业化展现正向循环效应金融界3月25日消息商汤科技(00020。HK)发布2021年全年财务业绩报告。财报显示,2021年,商汤科技全年营收47亿元人民币,同比增长36。4毛利润32。78亿元,同比增长电动车替代产品出现,售价高达8万一辆,上市后你会买吗?如今的新能源产品越来越多,人们的选择也更多样化。以汽车为例,在油价进入九元时代之后,不少燃油车主都纷纷开始羡慕新能源车主,他们不必为油价的上涨而担忧,在日常生活当中,也不必因为油价GO语言(二十五)管理依赖项(上)当您的代码使用外部包时,这些包(作为模块分发)成为依赖项。随着时间的推移,您可能需要升级或更换它们。Go提供了依赖管理工具,可帮助您在合并外部依赖项时确保Go应用程序的安全。本主题比绿色更绿的苹果13最新款,你们觉得好看么2022年经济本来就很紧张了,我的手机摔碎了,不得不重新买一个,我通常买东西都只买顶配,配件当然也不例外,接下来我大家看看我都给我我的苹果手机配置了哪些吧。一苹果手机苹果13proiPhoneSE开箱解析高性能A15搭配小电池,它真适合日常使用吗?评价君可能是数量很稀少的iPhoneSE三代用户。毕竟虽然苹果手机用户非常多,但这款手机上市到现在,京东上只有7000多人买了,而评价君购入这款产品的时候,但是京东才卖了不到250两千价位手机怎么选?这五款才是真王者,最后一款贴本出售两千价位能否买到好手机?这个问题估计困扰着很多消费者,就如今的手机市场而言,千元差不多是入门水平,2K档只能算是中端,3K4K可以说是中高端,56K以上的才能真正算作高端。这样一划佩服雷军,5500mAh大电池,12512G大存储,天玑8100新机2399起在最近上线的新旗舰中,可能从性价比和大参数角度看,最让人喜欢的就是RedmiK50系列了,也就是RedmiK50和RedmiK50Pro!用卢伟冰的话来说,这两款旗舰就是2022年