当前位置: 首页 > 科技观察

看看JDK8给我们带来了什么

时间:2023-03-18 01:02:00 科技观察

世界变化缓慢,但一直在变化。在JDK7赋予java全新面貌之后,java社区一直期待着java剩余的所有改进空间将随着JDK8甚至JDK9的诞生而消失。JDK8的目标是填补JDK7实施中的差距——一些难以实施的遗留问题。到2013年底,广大开发者将能够从三个具体方向改进和提升这门语言:开发效率;表现;模块化因此,从明年开始,将通过运行在各种平台(手机、云、桌面、服务器等)上,以java作为一种优化和改进的方式。接下来,我将概述一下我们对2013年的展望——正好赶上新年的年度计划——之后,我们将重点关注提高开发效率的lambda项目,以及如何在其中表达lambda代码导入。在开发效率和生产效率方面,JDK8主要改进了以下两个目标:-集合——通过对集合的扩展,使用更简洁-注解(annotations)-增强的注解支持,允许在上下文中编写注解,这目前是不可能的以这种方式(例如:原语)将Fork/Join框架添加到JDK7是我们迈向多核编程的第一步。JDK8通过提供对闭包(lambda表达式)的支持使这条路线更进一步。采集部分可能影响更大。闭包加上新的接口和函数将把java容器推向一个新的高度。除了增加可读性和代码简单性之外,lambda表达式还使集合操作能够充分利用多核处理器功能。模块化社区中最有趣的部分是jigsaw项目:这个项目的目的是为JAVASE平台设计和实现一个标准的模块化系统,然后将这个系统应用到平台本身和JDK中。这里我用过去式表示那些想要去掉classpath(环境变量)和classloader的,要等到JAVA9,至于那个时间点,也会因为jigsaw项目而延迟。一起来看看java在2013年的里程碑:2013/01/31M6功能完成2013/02/21M7开发者预览版2013/07/05M8最终候选版2013/09/09GA通用版除了拼图项目,另外一个让我们兴奋的大变化(在这个版本中)是对闭包的支持!有了lambda表达式的帮助,jdk会有一个关键的改进。Lambdas首先,我们需要下载一个支持lambda的jdk。有两种获取方式:*一种给敢于尝试的人:从sources源码自己构建*捷径版:直接下载编译好的sdk最初我是使用源码构建的,但是由于时间原因和一些与环境变量有关的警告,我选择了偷懒的方法:使用已经构建好的jdk。另一个重要的工具是用来编写代码的文本编辑器。以前是在jdk发布一段时间后才出一个配套的IDE。但是这次不一样了,可能也跟openjdk提供的透明性以及广泛使用的jdk有关。日前,JetBrain首款支持java8的IDE发布。因此,IntelliJIDEA12成为了第一个支持JDK8的IDE,那么其他改进呢?出于测试目的,我在win7x64机器上安装了支持jdk8b68的IntelliJ12社区版。喜欢Netbeans的开发者可以点击这里下载支持lambda的包。进入正确的心态要尝试使用最新功能编写更高效、更简洁的代码,您必须了解一些新概念——好吧,至少我需要它们。什么是lambda表达式?最简单的理解lambda表达式的方法是,你可以把它想象成一个方法:“它提供了一系列形式参数和一个通过这些参数表达逻辑的方法体——它可以是一个表达式,也可以是一个代码段。lambda表达式的参数可以是声明的,也可以是引用的,当这些参数是引用类型时,那么这些类型是从lambda表达式的函数式接口派生出来的,从返回值的角度来看,lambda表达式的表达式可以为null——它们不返回结果或有值——表达式中执行的语句返回一个值。以下是lambda表达式的示例:(a)(inta,intb)->a+b(b)(inta,intb)->{if(a>b){return;}elseif(a==b){returna*b;}else{返回;}}什么是功能接口?函数式接口是只包含抽象方法的接口,只是声明一个函数。在某些情况下,唯一的函数可能是具有重载因子的多态函数,在这种情况下,所有函数在外部都是函数。除了通常通过创建和初始化类来创建接口实例之外,还可以使用lambda表达式、方法或构造引用来创建功能接口实例。下面是一个功能接口的例子://custombuiltfunctionalinterfacepublicinterfaceFuncInterface{publicvoidinvoke(Strings1,Strings2);下面是来自javaapi的函数式接口:java.lang.Comparablejava.lang.Runnablejava.util.concurrent.Callablejava.awt.event.ActionListener接下来,让我们看看线程的启动可能会发生怎样的变化未来:旧方法:newThread(newRunnable(){@Overridepublicvoidrun(){for(inti=0;i<9;i++){System.out.println(String.format("Message#%dfrominsidethethread!",我开始();新方法:newThread(()->{for(inti=0;i<9;i++){System.out.println(String.format("Message#%dfrominsidethethread!",i));}}).start();尽管我没有写过任何与javaswing、AWT函数相关的东西,但我仍然可以得出结论:lambdas肯定会给那些Swing开发人员带来很多便利。动作监听:JButtonbutton=newJButton("Click");//新方式:button.addActionListener((e)->{System.out.println("Thebuttonwasclicked!");});//OLDWAY:button.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){System.out.println("Thebuttonwasclickedusingoldfashioncode!");}});山姆是什么?SAM是单个抽象方法的替代品,因此,简单地说,我们可以说SAM==功能接口。尽管在最初的规范中,只有一个抽象方法的抽象类被认为是SAM类型,但许多人仍然发现/猜测了这种定义的原因。方法/构造函数参考lambda听起来不错?但不知何故,函数式接口有些限制——这是否意味着我只能使用具有单一抽象方法的接口?不一定——JDK8提供了一种别名机制,允许“调用”类或对象的方法。这可以通过一个新的运算符::来完成。它可以应用于静态方法或对象方法的调用。这同样适用于构造函数。参考代码:interfaceConstructorReference{Tconstructor();}interfaceMethodReference{voidanotherMethod(Stringinput);}publicclassConstructorClass{Stringvalue;publicConstructorClass(){值="默认";}publicstaticvoidmethod(Stringinput){System.out.println(input);Stringinput){//操作}publicstaticvoidmain(String...args){//constructorreferenceConstructorReferencereference=ConstructorClass::new;ConstructorClasscc=reference.constructor();//staticmethodreferenceMethodReferencemr=cc::method;//objectmethodreferenceMethodReferencemr2=cc::nextMethod;System.out.println(cc.value);Defaultmethodininterface这意味着从8版本开始,JAVA接口可以包含方法体,为了简单起见,JAVA将支持多重继承,摆脱之前令人头疼的问题。而且,通过为接口方法提供默认实现,您可以确保添加父方法不会在实现类中造成混淆。JDK8为接口添加了默认方法,例如:java.util.Collection和java.util.Iterator,通过这个特性,我们可以提供一种机制,在我们真正需要的时候更好地使用lambdas。新增的主要接口:java.util.stream.Streamablejava.util.stream.Stream改进了集合的交互在我看来,lambda项目的所有变化都是对语言的巨大补充,这将使这个。语言与当前标准对齐,使其更简单、更简洁,但这些变化很可能使该语言产生最大的效率影响和最大的cool+wow效果,进而对集合框架进行全面检修。不过这个没有collection2framework的概念,我们还是要做typeexploration的处理,但是JAVA还会有其他重要的变化:从外到内的迭代。因此,它为开发人员提供了一种以优雅的方式过滤和聚合集合的机制,除其他外,提高了效率。通过提供一个lambda表达式,在内部执行,从而充分发挥多核处理器的功能。让我们考虑以下场景:如果有一个字符串列表,选择列表中的所有对象并将它们转换为大写。这个怎么写?老方法如下://.....ListinputList=newLinkedList<>();Listupper=newLinkedList<>();//添加元素for(StringcurrentValue:inputList){if(currentValue!=null&¤tValue.matches("*")){upper.add(currentValue);}}System.out.println(上);新方法://.....inputList.stream().filter(x->(x!=null&&x.matches("[A-Z0-9]*"))).into(upper);b.如果要将所有提取的字符转换为小写字母。用JDK8做它看起来像这样:/.....inputList.stream().filter(x->(x!=null&&x.matches("[A-Z0-9]*"))).map(字符串::toLowerCase).into(upper);C。如何找出所选集中的字符数://.....intsumX=inputList.stream().filter(x->(x!=null&&x.matches("[A-Z0-9]*"))).map(String::length).reduce(0,Integer::sum);使用的方法:defaultStreamstream()//java.util.CollectionStreamfilter(Predicatepredicate)//java.util.stream.StreamIntStreammap(IntFunctionmapper)//java.util.stream.Streamd。如果你想从集合中取出每个元素并打印出来,你应该怎么做?//旧方法:for(Stringcurrent:list){System.out.println(current);}//新方法:list.forEach(x->System.out.println(x));除了上面提到的功能之外,JDK8还有其他一些有趣的新特性,但是为了简洁起见,我们这里不再介绍。有关JDK8的更多信息可以在JDK8的lambda项目[ahref="http://jdk8.java.net/lambda/"]或JSR337网页上找到。总而言之,Java在不断改进,我个人喜欢它的发展方向,另一个最喜欢的是库开发人员开始采用JDK8的时候。这肯定会很有趣。相关资料BrianGoetz资源目录:http://cr.openjdk.java.net/~briangoetz/lambda方法/构造函数参考:http://doanduyhai.wordpress.com/2012/07/14/java-8-lambda-in-details-part-iii-method-and-constructor-referencing原文链接:http://www.oschina.net/translate/far-sight-look-at-jdk8