java 8 新功能详解
注意:确保还检查了我们的详细教程Java 8 Features – ULTIMATE Guide 。
Jdk 1.8(又名Java 8)今天发布,这意味着它的通用发布版本已经公开发售,开发人员可以从早期版本转换为经过测试的版本以用于生产。 但是对于繁忙的Java开发人员来说,这对您意味着什么? 好吧,我总结了一些要标记此版本的要点:
1.Lamda表达式
我从lambda表达式开始,因为它可能是Java 5中的Generics / Annotations之后的语言中最受欢迎的功能。
语法如下:
(argtype arg...) -> { return some expression.. probably using these arguments }
它的作用是在明显的地方(例如在匿名内部类中)减少代码。 (摇摆动作处理程序变得很性感,是的!)
因此,线程可以更改为:
Runnable oldRunner = new Runnable(){public void run(){System.out.println("I am running");}
};
Runnable java8Runner = () ->{System.out.println("I am running");
};
与Scala相似,Lambdas中也可以进行类型推断。 考虑以下可用示例:
Comparator c = (a, b) -> Integer.compare(a.length(), b.length());
在此,随着比较方法的实现,可以推断出a,b的类型(在这种情况下为String,来自Comparator接口)。
用于将块与参数分开的符号->与Scala中已经使用的=>十分相似,如果您擅长使用该符号,则没有太多理由进行切换,因为您会感觉到Java中实现lambda的方式是不够的(和冗长),但是对于一个优秀的'ol Java程序员来说,这是要走的路。
2.通用类型的更改和改进
从Lambdas获得线索后,通用集合还可以推断要使用的数据类型。 例如,使用通用集合的方法无需指定通用类型。 因此,以下方法
SomeClass.method();
可以简单地忽略类型信息而调用:
SomeClass.method();
可以通过方法签名来推断类型,这对于嵌套调用(如
myCollection.sort().removeUseless().beautify();
3.流集合类型(
流是一个迭代器,它允许对其调用的集合进行单次运行。 与Lambdas一起,这是另一个值得关注的功能。 您可以使用流来执行诸如Filer或对集合进行映射/缩小的功能性操作,这些集合可以使用Stream对象作为单个元素进行流式处理。 流可以根据需要顺序或并行运行。 并行模式利用fork / join框架,可以利用多个内核的功能。
例:
List guys = list.getStream.collect(Collectors.toList())
也可以并行实现为
List guys = list.getStream.parallel().collect(Collectors.toList()
将集合减少为单个项目的另一个不错的示例是调用reduce algorithem。
int sum = numberList.stream().reduce(0, (x, y) -> x+y);
要么,
int sum = numberList.stream().reduce(0, Integer::sum);
4.功能接口(
这些接口包含一些不需要实现的默认方法,可以直接从该接口运行。 这对现有代码有帮助-更改接口不必使实现它的所有类都实现新方法。 这类似于Scala中的Traits,功能接口将与lambda兼容。
5. Nashorn –
这是使我们能够运行javascript以在jvm上运行的javascript引擎。 它类似于运行Node.js的chrome提供的V8引擎。 它与Node.js应用程序兼容,同时还允许服务器上运行的javascript代码调用实际的Java库。 至少可以说这令人兴奋,因为它直接将Node.js的可伸缩性和异步特性与安全且广泛的服务器端Java中间件结合在一起。
6.日期/时间更改(
http://download.java.net/jdk8/docs/api/java/time/package-summary.html
日期/时间API移至java.time包,并遵循Joda时间格式。 另一个好处是,大多数类都是线程安全的并且是不可变的。
7.类型注释
现在,注释可用于装饰通用类型本身。
例如:
List<@Nullable String>
这并非总是希望的,但在某些情况下可以证明是有用的。 除了装饰泛型类型之外,它还可以用于构造函数和强制转换。
new @NonEmpty @Readonly List(myNonEmptyStringSet)
new @Interned MyObject()myString = (@NonNull String) myObject;
甚至可以注释数组对象:
@NotNull String[] arr;
包含RuntimeVisibleTypeAnnotations和RuntimeInvisibleTypeAnnotations属性,这些属性使.class文件保存注释信息。
8.Other –(很高兴)更改
在TypeName,GenericString等的支持下,反射api有所增加。
String.join()方法是一个受欢迎的补充,因为创建了许多自行创建的实用程序类。 所以,下面的例子
String abc= String.join(" ", "Java", "8");
将被评估为“ Java 8”。
在“集合”包中,对Comparator接口进行了改进,并添加了诸如反转,比较和随后的COmparing之类的方法,可轻松自定义多个字段的比较。 诸如Concurrency和NIO之类的其他库也已更新,但值得关注,并且与api中的更改保持一致。
总体而言,Java8被深思熟虑,并且使主流Java变得简明扼要,并选择了Scala / Clojure的一些出色部分来改进其语法并解决人们所寻求的功能。
翻译自: https://www.javacodegeeks.com/2014/03/8-new-features-for-java-8.html
java 8 新功能详解