JAVA8-十大新特性详解

合集下载

JAVA8十大新特性详解

JAVA8十大新特性详解

JAVA8 十大新特性详‎解本教程将Ja‎v a8的新特‎新逐一列出,并将使用简单‎的代码示例来‎指导你如何使‎用默认接口方‎法,lambda‎表达式,方法引用以及‎多重A nno‎t ation‎,之后你将会学‎到最新的A P‎I上的改进,比如流,函数式接口,Map以及全‎新的日期A P‎I“Jav a‎is‎still‎not‎dead—and people‎are starti‎n g to figure‎that‎out.”本教程将用带‎注释的简单代‎码来描述新特‎性,你将看不到大‎片吓人的文字‎。

一、接口的默认方‎法Java 8允许我们给‎接口添加一个‎非抽象的方法‎实现,只需要使用 defaul‎t关键字即可‎,这个特征又叫‎做扩展方法,示例如下:复制代码代码‎如下:interf‎a ce F ormul‎a {double‎calcul‎a te(int a);defaul‎t double‎sqrt(int a) {return‎Math.sqrt(a);}}F ormul‎a接口在拥有‎c alcul‎a te方法之‎外同时还定义‎了sqrt方‎法,实现了F or‎m ula接口‎的子类只需要‎实现一个ca‎l culat‎e方法,默认方法sq‎r t将在子类‎上可以直接使‎用。

复制代码代码‎如下:F ormul‎a formul‎a = new F ormul‎a() {@O v erri‎d epublic‎double‎calcul‎a te(int a) {return‎sqrt(a * 100);}};formul‎a.calcul‎a te(100); // 100.0formul‎a.sqrt(16); // 4.0文中的for‎m ula被实‎现为一个匿名‎类的实例,该代码非常容‎易理解,6行代码实现‎了计算sqrt(a * 100)。

在下一节中,我们将会看到‎实现单方法接‎口的更简单的‎做法。

JAVA十大新性详解

JAVA十大新性详解

JAVA8 十大新特性详解本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API“Java is still not dead—and people are starting to figure that out.”本教程将用带注释的简单代码来描述新特性,你将看不到大片吓人的文字。

一、接口的默认方法Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法,示例如下:复制代码代码如下:interface Formula {double calculate(int a);default double sqrt(int a) {return Math.sqrt(a);}}Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用。

复制代码代码如下:Formula formula = new Formula() {@Overridepublic double calculate(int a) {return sqrt(a * 100);}};formula.calculate(100); // 100.0formula.sqrt(16); // 4.0文中的formula被实现为一个匿名类的实例,该代码非常容易理解,6行代码实现了计算sqrt(a * 100)。

在下一节中,我们将会看到实现单方法接口的更简单的做法。

译者注:在Java中只有单继承,如果要让一个类赋予新的特性,通常是使用接口来实现,在C++中支持多继承,允许一个子类同时具有多个父类的接口与功能,在其他语言中,让一个类同时具有其他的可复用代码的方法叫做mixin。

java8--新特性汇总

java8--新特性汇总

java8--新特性汇总1. 接⼝中有默认的实现⽅法interface Formula{double calculate(int num);default double sqrt(int n){ // 实现类⾃动获得default标记的⽅法return Math.sqrt(n);}}public class Java8 {public static void main(String[] args) {Formula formula = new Formula(){@Overridepublic double calculate(int n) {return sqrt(n * 100);}};System.out.println(formula.calculate(4));//4*10开平⽅ = 20.0System.out.println(formula.sqrt(900)); // 900开平⽅ = 30.0}}mbda 表达式-排序public static void main(String[] args) {List<String> fruits = Arrays.asList("apple", "banana", "corn", "pear", "mango", "orange");//1.传统排序Collections.sort(fruits, new Comparator<String>() {@Overridepublic int compare(String a, String b) {return pareTo(a); //后⾯b在前⾯a就是逆序}});System.out.println(fruits); //[pear, orange, mango, corn, banana, apple] 后⾯的排在前⾯//2. lambda 排序Collections.sort(fruits, (String a, String b) ->{return pareTo(b);});System.out.println(fruits); //顺序[apple, banana, corn, mango, orange, pear]Collections.sort(fruits,(String a, String b) -> pareTo(a));System.out.println(fruits); // 逆序[pear, orange, mango, corn, banana, apple]}3. 函数式接⼝@FunctionalInterface:接⼝中只能有⼀个抽象⽅法!可以有多个默认⽅法!@FunctionalInterfacepublic interface Converter<F, T> {T convert(F from);}//(from) ->Integer.valueOf(from)public static void main(String[] args) {Converter<String, Integer> converter = (from) ->Integer.valueOf(from);Integer converted = converter.convert("1234");System.out.println(converted);//1234}4. ⽅法与构造⽅法的引⽤ :://4.1@FunctionalInterfacepublic interface Converter<F, T> {T convert(F from);}// Integer::valueOfpublic class Java8 {public static void main(String[] args) {Converter<String, Integer> converter = Integer::valueOf;Integer converted = converter.convert("123");System.out.println(converted); //123}}//4.2public class Person {String firstName;String lastName;Person(){}Person(String firstName, String lastName){this.firstName = firstName;stName = lastName;}}public interface PersonFactory<P extends Person> { // P 是泛型P create(String firstName, String lastName);}public class Java8 {public static void main(String[] args) {PersonFactory<Person> personFactory = Person::new;Person coco = personFactory.create("coco","可可");System.out.println(coco.firstName + ":" + stName); // coco:可可}}5. Lambda作⽤域@FunctionalInterfacepublic interface Converter<F, T> {T convert(F from);}// lambda对本地变量只有读操作,对静态变量和对象属性有读写操作public class Java8 {public static void main(String[] args) {int num = 1; // 加final也可以Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num);String result = stringConverter.convert(301);System.out.println(result); //31// num = 8; //被lambda表达式⽤过就具有final属性,不能更改它的value :如下则报错// System.out.println(num); //Error:(13, 86) java: 从lambda 表达式引⽤的本地变量必须是最终变量或实际上的最终变量}}6.Optinal接⼝防⽌NullPointerException异常的辅助类型,推荐不返回null⽽是返回Optionalpublic class Java8 {public static void main(String[] args) {Optional<String> optional = Optional.of("bam"); // Optional<String> optional = new Optional<String>(value);System.out.println(optional.isPresent()); // true return value != null;System.out.println(optional.get()); // bam value !=null ? value : throw new NoSuchElementException("No value present");System.out.println(optional.orElse("fallback")); //bam value != null ? value : otheroptional.ifPresent((str) -> System.out.println(str.charAt(0))); //b if (value != null) consumer.accept(value);}}7. Stream 接⼝java.util.Stream 表⽰能应⽤在⼀组元素上⼀次执⾏的操作序列。

全网最通透的Java8版本特性讲解

全网最通透的Java8版本特性讲解

全⽹最通透的Java8版本特性讲解「MoreThanJava」宣扬的是「学习,不⽌ CODE」,本系列 Java 基础教程是⾃⼰在结合各⽅⾯的知识之后,对 Java 基础的⼀个总回顾,旨在「帮助新朋友快速⾼质量的学习」。

当然不论新⽼朋友我相信您都可以从中获益。

如果觉得「不错」的朋友,欢迎「关注 + 留⾔ + 分享」,⽂末有完整的获取链接,您的⽀持是我前进的最⼤的动⼒!特性总览以下是 Java 8 中的引⼊的部分新特性。

关于 Java 8 新特性更详细的介绍可参考。

接⼝默认⽅法和静态⽅法Lambda 表达式函数式接⼝⽅法引⽤StreamOptionalDate/Time API重复注解扩展注解的⽀持Base64JavaFX其它JDBC 4.2 规范更好的类型推测机制HashMap 性能提升IO/NIO 的改进JavaScript 引擎 Nashorn并发(Concurrency)类依赖分析器 jdepsJVM 的 PermGen 空间被移除⼀. 接⼝默认⽅法和静态⽅法接⼝默认⽅法在 Java 8 中,允许为接⼝⽅法提供⼀个默认的实现。

必须⽤ default 修饰符标记这样⼀个⽅法,例如 JDK 中的 Iterator 接⼝:public interface Iterator<E> {boolean hasNext();E next();default void remove() { throw new UnsupportedOperationExceition("remove"); }}这将⾮常有⽤!如果你要实现⼀个迭代器,就需要提供 hasNext() 和 next() ⽅法。

这些⽅法没有默认实现——它们依赖于你要遍历访问的数据结构。

不过,如果你的迭代器是只读的,那么就不⽤操⼼实现 remove() ⽅法。

默认⽅法也可以调⽤其他⽅法,例如,我们可以改造 Collection 接⼝,定义⼀个⽅便的 isEmpty() ⽅法:public interface Collection {int size(); // an abstract methoddefault boolean isEmpty() { return size() == 0; }}这样,实现 Collection 的程序员就不⽤再操⼼实现 isEmpty() ⽅法了。

Java 8 新特性概述

Java 8 新特性概述

Java 8 新特性概述函数式接口Java 8 引入的一个核心概念是函数式接口(Functional Interfaces)。

通过在接口里面添加一个抽象方法,这些方法可以直接从接口中运行。

如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。

同时,引入了一个新的注解:@FunctionalInterface。

可以把他它放在一个接口前,表示这个接口是一个函数式接口。

这个注解是非必须的,只要接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解@FunctionalInterface 进行声明。

在接口中添加了@FunctionalInterface 的接口,只允许有一个抽象方法,否则编译器也会报错。

ng.Runnable 就是一个函数式接口。

[java] view plain copy print?在CODE上查看代码片派生到我的代码片@FunctionalInterfacepublic interface Runnable {public abstract void run();}Lambda 表达式函数式接口的重要属性是:我们能够使用Lambda 实例化它们,Lambda 表达式让你能够将函数作为方法参数,或者将代码作为数据对待。

Lambda 表达式的引入给开发者带来了不少优点:在Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,Lambda 表达式的应用则使代码变得更加紧凑,可读性增强;Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核CPU 的优势,更易于为多核处理器编写代码;Lambda 表达式由三个部分组成:第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;第二部分为一个箭头符号:->;第三部分为方法体,可以是表达式和代码块。

语法如下:1. 方法体为表达式,该表达式的值作为返回值返回。

Java8 新特性

Java8 新特性
同理:
传统写法:
new Thread(new Runnable() { @Override public void run() { System.out.println("hello lambda"); }
}).start();
Lambda 写法:
new Thread(() -> System.out.println("hello lambda")).start();
parameters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不 声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。 ->:可理解为“被用于”的意思。 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不返回,这里的 代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不返回。
if (temp.getPrice() > 3.00){ chooseAppleList.add(temp);
} } //顺序 Comparator<Apple> comparator = new Comparator<Apple>() {
@Override public int compare(Apple o1, Apple o2) {
Converter<String ,Integer> converter=new Converter<String, Integer>() { @Override public Integer convert(String from) { return Integer.valueOf(from); }

Java_新特性(Java8----Java11)

Java_新特性(Java8----Java11)

Java_新特性(Java8----Java11)第⼆⼗⼆章新特性22.1 Java8的新特性22.1.1 Java8的概述Java8是 Java 语⾔的⼀个重要版本,该版本于2014年3⽉发布,是⾃Java5以来最具⾰命性的版本,这个版本包含语⾔、编译器、库、⼯具和JVM等⽅⾯的⼗多个新特性。

22.1.2 函数式接⼝函数式接⼝主要指只包含⼀个抽象⽅法的接⼝,如:ng.Runnable、parator接⼝等。

Java8提供@FunctionalInterface注解来定义函数式接⼝,若定义的接⼝不符合函数式的规范便会报错。

Java8中增加了java.util.function包,该包包含了常⽤的函数式接⼝,具体如下:22.1.3 Lambda表达式Lambda 表达式是实例化函数式接⼝的重要⽅式,使⽤ Lambda 表达式可以使代码变的更加简洁紧凑。

lambda表达式:参数列表、箭头符号->和⽅法体组成,⽽⽅法体中可以是表达式,也可以是语句块。

语法格式:(参数列表) -> { ⽅法体; } - 其中()、参数类型、{} 以及return关键字可以省略。

22.1.4 ⽅法引⽤⽅法引⽤主要指通过⽅法的名字来指向⼀个⽅法⽽不需要为⽅法引⽤提供⽅法体,该⽅法的调⽤交给函数式接⼝执⾏。

⽅法引⽤使⽤⼀对冒号 :: 将类或对象与⽅法名进⾏连接,通常使⽤⽅式如下:对象的⾮静态⽅法引⽤ ObjectName :: MethodName类的静态⽅法引⽤ ClassName :: StaticMethodName类的⾮静态⽅法引⽤ ClassName :: MethodName构造器的引⽤ ClassName :: new数组的引⽤ TypeName[] :: new⽅法引⽤是在特定场景下lambda表达式的⼀种简化表⽰,可以进⼀步简化代码的编写使代码更加紧凑简洁,从⽽减少冗余代码。

22.1.5 Stream接⼝案例题⽬:准备⼀个List集合并放⼊Person类型的对象,将集合中所有成年⼈过滤出来放到另外⼀个集合并打印出来。

Java版本:JDK8的十大新特性介绍

Java版本:JDK8的十大新特性介绍

Java版本:JDK8的⼗⼤新特性介绍JDK8常⽤包及概述java.applet 提供了需要创建⼀个⼩程序和⽤来跟其他⼩程序交流上下⽂的类。

Java.awt 包含⽤于创建⽤户界⾯和绘制图形图像的所有类Java.io 提供与输⼊输出相关的类Java.beans 包含与开发javaBeans相关的类ng 提供java语⾔程序设计的基础类 提供实现⽹络操作相关的类Java.nio 为输⼊输出提供缓冲区的类Java.text 提供处理⽂本、⽇期、数字和消息的类和接⼝Java.util 提供处理⽇期、时间、随机数⽣成等各种使⽤⼯具的类 提供⽤于⽹络应⽤程序的类、⽹络应⽤扩展类Java.swing 提供⼀组与AWT功能相同的纯java的组件类java.sql 该包提供了使⽤Java语⾔访问并处理存储在数据源(通常是⼀个关系型数据库)中的数据API。

java.RMI 该包提供远程⽅法调⽤相关APIJDK8新特性:mbda表达式2.新的⽇期API3.引⼊Optional4.使⽤Base645.接⼝的默认⽅法和静态⽅法6.新增⽅法引⽤格式7.新增Stream类8.注解相关的改变9.⽀持并⾏(parallel)数组10.对并发类(Concurrency)的扩展。

⼀、Lambda表达式Lambda 表达式也可称为闭包,是推动Java 8 发布的最重要新特性。

lambda表达式本质上是⼀个匿名⽅法。

Lambda允许把函数作为⼀个⽅法的参数(函数作为参数传递进⽅法中)或者把代码看成数据。

使⽤Lambda 表达式可以使代码变的更加简洁紧凑。

在最简单的形式中,⼀个lambda可以由:⽤逗号分隔的参数列表、–>符号、函数体三部分表⽰,在某些情况下lambda的函数体会更加复杂,这时可以把函数体放到在⼀对花括号中,就像在Java中定义普通函数⼀样。

Lambda可以引⽤类的成员变量与局部变量(如果这些变量不是final的话,它们会被隐含的转为final,这样效率更⾼)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JAVA8十大新特性详解本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期APIFormula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用。

文中的formula被实现为一个匿名类的实例,该代码非常容易理解,6行代码实现了计算sqrt(a*100)。

在下一节中,我们将会看到实现单方法接口的更简单的做法。

public int compare(String a,String b){return pareTo(a);}});只需要给静态方法Collections.sort传入一个List对象以及一个比较器来按指定顺序排列。

通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。

看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短:对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,但是你还可以写得更短点:Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型。

接下来我们看看lambda表达式还能作出什么更方便的东西来:三、函数式接口Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。

而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。

因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。

需要注意如果@FunctionalInterface如果没有指定,上面的代码也是对的。

Java8允许你使用::关键字来传递方法或者构造函数引用,上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法:接下来看看构造函数是如何使用::关键字来引用的,首先我们定义一个包含多个构造函数的简单类:接下来我们指定一个用来创建Person对象的对象工厂接口:这里我们使用构造函数引用来将他们关联起来,而不是实现一个完整的工厂:PersonFactory<Person>personFactory=Person::new;Person person=personFactory.create("Peter","Parker");我们只需要使用Person::new来获取Person类构造函数的引用,Java编译器会自动根据PersonFactory.create方法的签名来选择合适的构造函数。

但是和匿名对象不同的是,这里的变量num可以不用声明为final,该代码同样正确:不过这里的num必须不可被后面的代码修改(即隐性的具有final的语义),例如下面的就无法编译:在lambda表达式中试图修改num同样是不允许的。

七、访问对象字段与静态变量outerNum=23;return String.valueOf(from);};Converter<Integer,String>stringConverter2=(from)->{outerStaticNum=72;return String.valueOf(from);};}}八、访问接口的默认方法还记得第一节中的formula例子么,接口Formula定义了一个默认方法sqrt可以直接被formula的实例包括匿名对象访问到,但是在lambda表达式中这个是不行的。

Lambda表达式中是无法访问到默认方法的,以下代码将无法编译:JDK1.8API包含了很多内建的函数式接口,在老Java中常用到的比如Comparator或者Runnable接口,这些接口都增加了@FunctionalInterface 注解以便能用在lambda上。

Java8API同样还提供了很多全新的函数式接口来让工作更加方便,有一些接口是来自Google Guava库里的,即便你对这些很熟悉了,还是有必要看看这些是如何扩展到lambda上使用的。

Predicate接口Function接口Function<String,Integer>toInteger=Integer::valueOf;Function<String,String>backToString=toInteger.andThen(String::valueOf); backToString.apply("123");//"123"Supplier接口Supplier接口返回一个任意范型的值,和Function接口不同的是该接口没有任何参数Consumer接口Consumer接口表示执行在单个参数上的操作。

Comparator接口Comparator是老Java中的经典接口,Java8在此之上添加了多种默认方法:Optional接口optional.isPresent();//trueoptional.get();//"bam"optional.orElse("fallback");//"bam"optional.ifPresent((s)->System.out.println(s.charAt(0)));//"b"Stream接口Java8扩展了集合类,可以通过Collection.stream()或者Collection.parallelStream()来创建一个Stream。

下面几节将详细解释常用的Stream操作:Sort排序.filter((s)->s.startsWith("a")).forEach(System.out::println);//"aaa1","aaa2"需要注意的是,排序只创建了一个排列好后的Stream,而不会影响原有的数据源,排序之后原数据stringCollection是不会被修改的:Map映射中间操作map会将元素根据指定的Function接口来依次将元素转成另外的对象,下面的示例展示了将字符串转换为大写字符串。

你也可以通过map 来讲对象转换成其他类型,map返回的Stream类型是根据你map传递进去的函数的返回值决定的。

Match匹配Reduce规约并行Streams然后我们计算一下排序这个Stream要耗时多久,串行排序:接下来展示如何在Map里删除一个键值全都匹配的项:map.remove(3,"val33");map.get(3);//null另外一个有用的方法:对Map的元素做合并也变得很容易了:Merge做的事情是如果键名不存在则插入,否则则对原键对应的值做合并操作并重新插入到map中。

Timezones时区//ZoneRules[currentStandardOffset=+01:00]//ZoneRules[currentStandardOffset=-03:00]LocalTime本地时间LocalTime提供了多种工厂方法来简化对象的创建,包括解析时间字符串。

System.out.println(dayOfWeek);//FRIDAY从字符串解析一个LocalDate类型和解析LocalTime一样简单:DateTimeFormatter germanFormatter=DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.GERMAN);LocalDate xmas=LocalDate.parse("24.12.2014",germanFormatter);System.out.println(xmas);//2014-12-24LocalDateTime本地日期时间只要附加上时区信息,就可以将其转换为一个时间点Instant对象,Instant时间点对象可以很容易的转换为老式的java.util.Date。

格式化LocalDateTime和格式化时间和日期一样的,除了使用预定义好的格式外,我们也可以自己定义格式:和java.text.NumberFormat不一样的是新版的DateTimeFormatter是不可变的,所以它是线程安全的。

关于时间日期格式的详细信息:/jdk8/docs/api/java/time/format/DateTimeFormatter.htmlJava8允许我们把同一个类型的注解使用多次,只需要给该注解标注一下@Repeatable即可。

例2:使用多重注解(新方法)第二个例子里java编译器会隐性的帮你定义好@Hints注解,了解这一点有助于你用反射来获取这些信息:即便我们没有在Person类上定义@Hints注解,我们还是可以通过getAnnotation(Hints.class)来获取@Hints注解,更加方便的方法是使用getAnnotationsByType可以直接获取到所有的@Hint注解。

另外Java8的注解还增加到两种新的target上了:@Target({ElementType.TYPE_PARAMETER,ElementType.TYPE_USE})@interface MyAnnotation{}关于Java8的新特性就写到这了,肯定还有更多的特性等待发掘。

JDK1.8里还有很多很有用的东西,比如Arrays.parallelSort,StampedLock和CompletableFuture等等。

相关文档
最新文档