java1.8的几大新特性

一、接口的默认方法,也就是接口中可以有实现方法

 1 public class Test {
 2     public static void main(String[] args) {
 3         Formula a=new For();
 4         a.calculate(1);
 5         System.out.println(a.sqrt(8));
 6
 7
 8     }
 9     interface Formula {
10         double calculate(int a);
11         default double sqrt(int a) {//这个方法可以在实现类重写,或者直接使用
12             return Math.sqrt(a);
13         }
14     }
15     static class For implements Formula{
16         @Override
17         public double calculate(int a) {
18             return 0;
19         }
20
21         @Override
22         public double sqrt(int a) {
23             return 0;
24         }
25     }
26 }

以前的版本定义接口是不能有实现机制的,现在这样用了一个default关键字后,就可以实现,然后子类可以重写,也可以直接使用了。好处多多,感觉有点抽象类了...越来越灵活了

二、Lambda 表达式

 1 public class Test {
 2     public static void main(String[] args) {
 3         List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
 4         Collections.sort(names, new Comparator<String>() {//java以前老版本的写法
 5             @Override
 6             public int compare(String a, String b) {
 7                 return b.compareTo(a);
 8             }
 9         });
10         for(String name:names){
11             System.out.println(name);
12         }
13     }
14
15 }
 1 只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。
 2 在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:
 3 复制代码 代码如下:
 4
 5 Collections.sort(names, (String a, String b) -> {
 6     return b.compareTo(a);
 7 });
 8
 9 看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短:
10 复制代码 代码如下:
11
12 Collections.sort(names, (String a, String b) -> b.compareTo(a));
13
14 对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,但是你还可以写得更短点:
15 复制代码 代码如下:
16
17 Collections.sort(names, (a, b) -> b.compareTo(a));
18
19 Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型。接下来我们看看lambda表达式还能作出什么更方便的东西来:

lambda表达式的使用简化了代码。

三、函数式接口与静态导入

Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。

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

我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。

 1 public class Test {
 2     public static void main(String[] args) {
 3         Converter<String, Integer> a = (from) -> Integer.valueOf(from);
 4
 5         //Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用
 6         Converter<String, Integer> converter = Integer::valueOf;//这个是静态方式导入
 7
 8         Integer m=a.convert("123");
 9         System.out.println(m);
10         test test=mmm -> "aaaa";//mmm代表你要传入的参数
11         String testResult=test.aa("");//aa代表你要传入的方法
12         System.out.println(testResult);
13     }
14
15     @FunctionalInterface
16     interface Converter<F, T> {
17         T convert(F from);
18     }
19
20     interface test{
21         String aa(String mmm);
22     }
23
24     //使用函数式接口时,接口的定义只能有一个,@FunctionalInterface注解可有可无
25 }

四、Lambda 作用域

在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。

五、访问局部变量

 1 public class Test {
 2     public static void main(String[] args) {
 3         final int num = 1;
 4         Converter<Integer, String> stringConverter =
 5                 (from) -> String.valueOf(from + num);
 6         String str=stringConverter.convert(2);
 7         System.out.println(str);//输出3
 8         //final关键字可以去掉,但是默认是存在的,所以,对num变量不能再次赋值修改
 9     }
10
11     @FunctionalInterface
12     interface Converter<F, T> {
13         T convert(F from);
14     }
15
16 }

六、访问对象字段与静态变量

 1 public class Test {
 2     public static void main(String[] args) {
 3         Lambda4 lambda4=new Lambda4();
 4         lambda4.testScopes();
 5     }
 6
 7     @FunctionalInterface
 8     interface Converter<F, T> {
 9         T convert(F from);
10     }
11
12     static class Lambda4 {
13         static int outerStaticNum=0;
14         int outerNum=0;
15         void testScopes() {
16             Converter<Integer, String> stringConverter1 = (from) -> {
17                 outerNum = 23;
18                 return String.valueOf(outerNum);
19             };
20             String a=stringConverter1.convert(outerNum);
21             System.out.println(a);//输出23
22             Converter<Integer, String> stringConverter2 = (from) -> {
23                 outerStaticNum = 72;
24                 return String.valueOf(outerStaticNum);
25             };
26
27         }
28     }
29
30     //这里的意思是outerStaticNum与outerNum两个参数可以多次赋值
31
32 }
时间: 2024-11-25 20:23:42

java1.8的几大新特性的相关文章

java1.8的几大新特性(二)

七.Date APIJava 8 在包java.time下包含了一组全新的时间日期API.新的日期API和开源的Joda-Time库差不多,但又不完全一样,下面的例子展示了这组新API里最重要的一些部分: 1 public class Test { 2 public static void main(String[] args) { 3 /** 4 *(一) Clock 时钟 5 * Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代 System.currentT

可变参数列表-Java SE5新特性(转)

Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理.注意:可变参数必须位于最后一项.当可变参数个数多于一个时,必将有一个不是最后一项,所以只支持有一个可变参数.因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项. 可变参数的特点:(1)只能出现在参数列表的最后: (2)...位于变量类型和变量名之间,前后有无空格都可以:(3)调用可变参数的方法时,编译

java1.5的新特性

java1.5的新特性. java作为一门语言,是sun公司出品,这门语言有自己的语法规范.同时围绕着这门语言有一些基本的类库来供大家使用. 一门程序设计语言,可以简单的认为包含两部分,一个是基本的语法规则(包括关键字),另一个是用来支持这门语言的一些系统级得到基础类库. 所以,一门程序设计语言是可以不断被升级更新的,升级更新后的语言可能会增加新的语法规范. java1.5和java1.4作为不同版本的java语言,就有些不一样的地方: 所以就有java1.5的新特性需要掌握: 1.java1.

java1.8新特性(一)

一直在更新java 版本,原来也没有关注java版本的变化 引入的一些新的api  引起注意的还是  关于一些并发包的使用,那时候才对每个版本的特性 去了解了一下,虽然 不一定都用上了,但是不管学习什么语言,花点时间学习新的api还是很有必要的,在工作中 还用一些 1.8的新特性,但是 始终 是 不明白.总是有问题,特意花些时间 去重点学习一下,如果其中 有什么说的不对,请一定要提出来! 用户 对象 User: package com.java; public class User { Stri

了解Java1.8新特性

前几天电脑上的JDK自动更新到1.8,这两天了解了一下JDK1.8的一些新特性.下面就来浅谈一下我所了解的. 我们都知道,Java是不能多继承的,但是可以多实现.它与C++不同,C++是可以多继承的.尽管Java可以实现多个接口,但是接口中只能有抽象方法,不能有具体的实现.但是在JDK1.8中,接口里新增了默认方法.可以对默认方法进行具体的实现,但是这个方法必须是default.看下面这段代码: 1 interface AA{ 2 public int add(int a,int b); //申

java1.4升级到java1.5 新特性

前几天和一位腾讯的技术大牛聊天,聊到关于jdk的很多支持,包括jvm的优化,gc的调用机制,1.4-到1.8每次升级版本的新特性等,做软件这行这么多年了,一直在使用java,但是却从来没有细细的研究每个版本新特性到底有什么不同,所以特意编写了这么一篇文档,让自己能了解些他们的新特性,也共享一下新特性的改变,当然我下面的验证并不能当做最官方的,但最起码我是一个一个实验了,如果存在问题或解释的不正确的,也劳烦各位大牛给予指正. 目前我下载的jdk版本,如果大家需要这些版本的话,后期我会上传到百度云上

从java1到java9每个版本都有什么新特性?

每次出新版本,大家大概都会这么问,"Java X会有什么特性呢?" .在下面的内容里,我总结了至今为止的Java主要发行版中各自引入的新特性,这样做的目的是为了突出各个新特性是在哪个发行版中引入的.除了列出的特性外,每个发行版还做了很多优化和修复BUG的工作. Java 9 请参考: http://www.techug.com/post/java-9-features-with-examples.html Java SE 8 Java 8是于2014年3月14号发布.从Java 8开始

ygRan Java1.0-1.11各个版本的新特性

JDK Version 1.01996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢. JDK Version 1.11997-02-19 JDBC(Java DataBase Connectivity);支持内部类;RMI(Remote Method Invocation) ;反射;Java Bean;JDK Version 1.21998-12-08 Playground(操场) 集合框架;JIT(Just In Time)

Java1.0-1.12各个版本的新特性

JDK Version 1.0 1996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢. JDK Version 1.1 1997-02-19 JDBC(Java DataBase Connectivity);支持内部类;RMI(Remote Method Invocation) ;反射;Java Bean; JDK Version 1.2 1998-12-08 Playground(操场) 集合框架;JIT(Just In T