关系经济人类预测化学自然
投稿投诉
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产

jdk1。8新增特性

7月23日 望北海投稿
  1、default关键字
  在java里面,我们通常都是认为接口里面是只能有抽象方法,不能有任何方法的实现的,那么在jdk1。8里面打破了这个规定,引入了新的关键字default,通过使用default修饰方法,可以让我们在接口里面定义具体的方法实现,如下。
  那这么定义一个方法的作用是什么呢?为什么不在接口的实现类里面再去实现方法呢?
  其实这么定义一个方法的主要意义是定义一个默认方法,也就是说这个接口的实现类实现了这个接口之后,不用管这个default修饰的方法,也可以直接调用,如下。
  所以说这个default方法是所有的实现类都不需要去实现的就可以直接调用,那么比如说jdk的集合List里面增加了一个sort方法,那么如果定义为一个抽象方法,其所有的实现类如arrayList,LinkedList等都需要对其添加实现,那么现在用default定义一个默认的方法之后,其实现类可以直接使用这个方法了,这样不管是开发还是维护项目,都会大大简化代码量。
  2、Lambda表达式
  Lambda表达式是jdk1。8里面的一个重要的更新,这意味着java也开始承认了函数式编程,并且尝试引入其中。
  首先,什么是函数式编程,引用廖雪峰先生的教程里面的解释就是说:函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
  简单的来说就是,函数也是一等公民了,在java里面一等公民有变量,对象,那么函数式编程语言里面函数也可以跟变量,对象一样使用了,也就是说函数既可以作为参数,也可以作为返回值了,看一下下面这个例子。
  这是常规的Collections的排序的写法,需要对接口方法重写
  publicvoidtest1(){
  ListlistArrays。asList(aaa,fsa,ser,eere);
  Collections。sort(list,newComparator(){
  Override
  publicintcompare(Stringo1,Stringo2){
  returno2。compareTo(o1);
  }
  });
  for(Stringstring:list){
  System。out。println(string);
  }
  }
  这是带参数类型的Lambda的写法
  publicvoidtestLamda1(){
  ListlistArrays。asList(aaa,fsa,ser,eere);
  Collections。sort(list,(C?superString)(Stringa,Stringb){
  returnb。compareTo(a);
  }
  );
  for(Stringstring:list){
  System。out。println(string);
  }
  }
  这是不带参数的lambda的写法
  publicvoidtestLamda2(){
  ListlistArrays。asList(aaa,fsa,ser,eere);
  Collections。sort(list,(a,b)b。compareTo(a)
  );
  for(Stringstring:list){
  System。out。println(string);
  }
  可以看到不带参数的写法一句话就搞定了排序的问题,所以引入lambda表达式的一个最直观的作用就是大大的简化了代码的开发,像其他一些编程语言Scala,Python等都是支持函数式的写法的。当然,不是所有的接口都可以通过这种方法来调用,只有函数式接口才行,jdk1。8里面定义了好多个函数式接口,我们也可以自己定义一个来调用,下面说一下什么是函数式接口。
  3、函数式接口
  定义:函数式接口是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。jdk1。8提供了一个FunctionalInterface注解来定义函数式接口,如果我们定义的接口不符合函数式的规范便会报错。
  FunctionalInterface
  publicinterfaceMyLamda{
  publicvoidtest1(Stringy);
  这里如果继续加一个抽象方法便会报错
  publicvoidtest1();
  default方法可以任意定义
  defaultStringtest2(){
  return123;
  }
  defaultStringtest3(){
  return123;
  }
  static方法也可以定义
  staticvoidtest4(){
  System。out。println(234);
  }
  }
  看一下这个接口的调用,符合lambda表达式的调用方法。
  MyLamdamySystem。out。println(ssy);
  4。方法与构造函数引用
  jdk1。8提供了另外一种调用方式::,当你需要使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面,即ClassName::methodName。例如,Apple::getWeight就是引用了Apple类中定义的方法getWeight。请记住,不需要括号,因为你没有实际调用这个方法。方法引用就是Lambda表达式(Applea)a。getWeight()的快捷写法,如下示例。
  先定义一个函数式接口
  FunctionalInterface
  publicinterfaceTestConverTT,F{
  Fconvert(Tt);
  }
  测试如下,可以以::形式调用。
  publicvoidtest(){
  TestConverTString,IntegertInteger::valueOf;
  Integerit。convert(111);
  System。out。println(i);
  }
  此外,对于构造方法也可以这么调用。
  实体类User和它的构造方法
  publicclassUser{
  privateS
  privateS
  publicUser(Stringname,Stringsex){
  super();
  this。
  this。
  }
  }
  User工厂
  publicinterfaceUserFactory{
  Userget(Stringname,Stringsex);
  }
  测试类
  UserFactoryufUser::
  Useruuf。get(ww,man);
  这里的User::new就是调用了User的构造方法,Java编译器会自动根据UserFactory。get方法的签名来选择合适的构造函数。
  5、局部变量限制
  Lambda表达式也允许使用自由变量(不是参数,而是在外层作用域中定义的变量),就像匿名类一样。它们被称作捕获Lambda。Lambda可以没有限制地捕获(也就是在其主体中引用)实例变量和静态变量。但局部变量必须显式声明为final,或事实上是final。
  为什么局部变量有这些限制?
  (1)实例变量和局部变量背后的实现有一个关键不同。实例变量都存储在堆中,而局部变量则保存在栈上。如果Lambda可以直接访问局部变量,而且Lambda是在一个线程中使用的,则使用Lambda的线程,可能会在分配该变量的线程将这个变量收回之后,去访问该变量。因此,Java在访问自由局部变量时,实际上是在访问它的副本,而不是访问原始变量。如果局部变量仅仅赋值一次那就没有什么区别了因此就有了这个限制。
  (2)这一限制不鼓励你使用改变外部变量的典型命令式编程模式。
  finalintnum1;
  ConverterInteger,StringstringConverter
  (from)String。valueOf(fromnum);
  stringConverter。convert(2);
  6、DateApi更新
  1。8之前JDK自带的日期处理类非常不方便,我们处理的时候经常是使用的第三方工具包,比如commonslang包等。不过1。8出现之后这个改观了很多,比如日期时间的创建、比较、调整、格式化、时间间隔等。这些类都在java。time包下。比原来实用了很多。
  6。1LocalDateLocalTimeLocalDateTime
  LocalDate为日期处理类、LocalTime为时间处理类、LocalDateTime为日期时间处理类,方法都类似,具体可以看API文档或源码,选取几个代表性的方法做下介绍。
  now相关的方法可以获取当前日期或时间,of方法可以创建对应的日期或时间,parse方法可以解析日期或时间,get方法可以获取日期或时间信息,with方法可以设置日期或时间信息,plus或minus方法可以增减日期或时间信息;
  6。2TemporalAdjusters
  这个类在日期调整时非常有用,比如得到当月的第一天、最后一天,当年的第一天、最后一天,下一周或前一周的某天等。
  6。3DateTimeFormatter
  以前日期格式化一般用SimpleDateFormat类,但是不怎么好用,现在1。8引入了DateTimeFormatter类,默认定义了很多常量格式(ISO打头的),在使用的时候一般配合LocalDateLocalTimeLocalDateTime使用,比如想把当前日期格式化成yyyyMMddhh:mm:ss的形式:
  LocalDateTimedtLocalDateTime。now();
  DateTimeFormatterdtfDateTimeFormatter。ofPattern(yyyyMMddhh:mm:ss);
  System。out。println(dtf。format(dt));
  7、流
  定义:流是JavaAPI的新成员,它允许我们以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。就现在来说,我们可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,也就是说我们不用写多线程代码了。
  Stream不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的Iterator。原始版本的Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如过滤掉长度大于10的字符串、获取每个字符串的首字母等,Stream会隐式地在内部进行遍历,做出相应的数据转换。
  Stream就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。而和迭代器又不同的是,Stream可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方式去遍历时,每个item读完后再读下一个item。而使用并行去遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。Stream的并行操作依赖于Java7中引入的ForkJoin框架(JSR166y)来拆分任务和加速处理过程。
  流的操作类型分为两种:
  Intermediate:一个流可以后面跟随零个或多个intermediate操作。其目的主要是打开流,做出某种程度的数据映射过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。
  Terminal:一个流只能有一个terminal操作,当这个操作执行后,流就被使用光了,无法再被操作。所以这必定是流的最后一个操作。Terminal操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个sideeffect。
  在对于一个Stream进行多次转换操作(Intermediate操作),每次都对Stream的每个元素进行转换,而且是执行多次,这样时间复杂度就是N(转换次数)个for循环里把所有操作都做掉的总和吗?其实不是这样的,转换操作都是lazy的,多个转换操作只会在Terminal操作的时候融合起来,一次循环完成。我们可以这样简单的理解,Stream里有个操作函数的集合,每次转换操作就是把转换函数放入这个集合中,在Terminal操作的时候循环Stream对应的集合,然后对每个元素执行所有的函数。
  构造流的几种方式
  1。Inpidualvalues
  StreamstreamStream。of(a,b,c);
  2。Arrays
  String〔〕strArraynewString〔〕{a,b,c};
  streamStream。of(strArray);
  streamArrays。stream(strArray);
  3。Collections
  ListlistArrays。asList(strArray);
  streamlist。stream();
  三、总结
  总的来说,jdk1。8的一些新特性主要还是简化了代码的写法,减少了部分开发量,但是需要一些时间来熟悉。挺惭愧的,现在1。9都已经出来了,1。8的新特性还不是很熟悉,所以还是要继续努力,多看些开源的东西。
投诉 评论 转载

毛巾能当干发帽吗干发帽因其吸水性好且容易携带是当下人们最爱用的一款擦头神奇。由于其结构简单,很多人便在家里做起的干发帽。下面小编就分享用毛巾制作干发帽的技巧,大家一起来看看吧。毛巾能当干……世界最大单体免税店月底将正式营业,专家可促进海南购物游极目新闻记者丁鹏10月15日,海南离岛旅客免税购物政策实施情况新闻发布会透露,9月29日,海南两家离岛免税店按程序获得批准。其中,海口市一家将于10月28日正式营业,开业……jdk1。8新增特性1、default关键字在java里面,我们通常都是认为接口里面是只能有抽象方法,不能有任何方法的实现的,那么在jdk1。8里面打破了这个规定,引入了新的关键字defau……买手机不要扣扣搜搜,目前只有这3部手机值得买,可以用到202如果希望一部手机可以用四五年不换,那么在一开始入手的时候就要舍得花预算。今天我们就来聊一聊哪些手机虽然稍微贵点,但是性能抗打五年。iPhone13ProiPhone……陆金所互联网金融中式样本互联网金融监管细则出台前夜,大资本蜂拥进入P2P业务,寄希望在格局未定之际谋取一席之地。系出金融名门的陆金所凭借本息担保的优势,迅速扩张。但在去担保化的大趋势下,其需进一步挖掘……脸部毛孔粗大有黑头怎么办力荐个收缩毛孔的方法形成原因毛孔粗大:油脂分泌过于旺盛,堆积在毛囊无法排除,阻塞毛孔,导致毛孔粗大。黑头:油脂腺受到刺激,毛孔油脂阻塞,时间一长,油脂硬化,成为黑色的小点,就是我们所看……历史上燕赵京津冀地区发生的四次大地震清代以来至今三百多年间,京津冀地区(大约原直隶辖区)共发生四次7级以上大地震,分别涉及北京、唐山、邯郸、邢台,下面就来分别介绍之。一、1679年9月2日帝都北京大地震(8……势力造句用势力造句大全211、五邑侨团在海外唐人街是成立早、势力大的社会组织,集中分布在美洲、亚洲,其血缘性因素很大。212、基于此理由,“银色黎明”势力应该不会在诺森德再度出现了。21……上新!龙江路漫画街主题墙绘1LOOK!QINGDAO糖小狐的小幸福充满梦幻氛围的动漫街龙江路,以各种动漫涂鸦出圈,走进这里,就像不小心踏入了宫崎骏的童话世界。最近,龙江路上又添了一组全新主题墙绘马里……原来如是地铁在龙阳路站停下来,乘班车去看成衣时装展,并没有什么目的,我们只是无处可去,选择了权益之记。进场的手续颇为复杂,好象入关,排队登记来来去去四处走动,他因起的早觉得疲倦,……反差!刘国梁看决赛笑开怀,秦志戬坐旁边一脸严肃,愁到白了头2021赛季中国乒乓球俱乐部超级联赛男子团体赛尘埃落定,大胖梁靖崑率领山东魏桥,击败了马龙领衔的山东鲁能,此外,梁靖崑还收获了男子团体最有价值球员,踏上了去往世乒赛的末班车。……星座之巨蟹座详解巨蟹座(第四宫)6月2122日~7月2223日星座别名:西名Cancer日名蟹座、误名天蟹座。符号意义:螃蟹、螃蟹的钳子。星座象征:水象、阴性的基本星座,并且……
很多人都会得痤疮,有什么原因呢?OPPOFindX6系列将采用单孔曲屏屏幕分辨率为1。5K2这个游戏还适不适合小白进入?了解了,你才知道怎么赚诺基亚不卖手机还能盈利,到底是为什么?重磅!碑林区旅游目的地数字地图上线!打造全域旅游新场景商标热点丨华为申请多件5Green商标小米穿戴被驳回家长注意!2岁男童将硬币塞进电动车充电口手被炸黑楚乔传2宣发,男女主人选爆出,观众这是白等了五年吗?原来这是ChatGPT眼中的新龙门客栈失眠脱发经量少目涩昏花手脚麻木你可能是肝血不足了数说龙江好味道数说龙江好味道龙江大豆群星璀璨雷克沙NM800PRO2TB固态硬盘首发体验报告用料实在,速
固定资产贷款合同穿拖鞋可以坐过山车吗关于花的作文郁金香花开了汽车早餐新能源汽车上半年交出亮眼成绩单,蜂巢能源与宁德时代达骑着单车环台湾岛读后感精品有关爱国的的作文600字锦集六篇大母指甲上有竖纹怎么调理指甲上有竖纹怎么调理向上的青春,终将长成最好的模样大家看看这个设计合不合理全球最恐怖的鬼屋:印尼千门屋鬼屋【歌词】CruelMoon(H动画无颜之月ED)歌手:Dar 留在心底的记忆初中优秀作文热文聚热点网

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找菏泽德阳山西湖州宝鸡上海茂名内江三亚信阳长春北海西安安徽黄石烟台沧州湛江肇庆鹤壁六安韶关成都钦州