Java8新功能

Java8

Java 8发行版是自Java 5(发行于2004)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发工具与JVM(Java虚拟机)带来了大量新特性。
Java SE 8中的一些特性:
<ul>
     <li>函数式接口(functional interface)与lambda表达式</li>
     <li>方法和构造方法引用</li>
     <li>接口的默认方法</li>
</ul>


函数式接口(functional interface)与lambda表达式

简单来说,函数式接口是只包含一个抽象方法的接口,即像使用函数似的使用这个接口。比如Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口。函数式接口还可以使用lambda表达式来创建实现对象。
使用lambda表达式时,只需要提供形参和方法体。由于函数式接口只有一个抽象方法,所以通过lambda表达式声明的方法体就肯定是这个唯一的抽象方法的实现,而且形参的类型可以根据方法的类型声明进行自动推断。
比较下面两个方法:
<pre>public void runThread() {
    new Thread(new Runnable() {
        public void run() {
            System.out.println("Run!");
        }
    }).start();
}
public void runThreadUseLambda() {
    new Thread(() -&gt; {
        System.out.println("Run!");
    }).start();
}
</pre>
Java SE 8增加了java.util.function包,里面都是可以在开发中使用的函数式接口。开发人员也可以创建新的函数式接口。最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。


方法和构造方法引用(Method References)

方法引用是另外一种实现函数式接口的方法,在某些情况下,方法引用可以进一步简化代码。
Java 8中的方法也是一种对象,可以By名字来引用。不过方法引用的唯一用途是支持Lambda的简写,使用方法名称来表示Lambda。
方法引用可以在不调用某个方法的情况下引用一个方法。
构造方法引用可以在不创建对象的情况下引用一个构造方法。


接口的默认方法

接口的默认方法即在接口中新添加的方法使用default关键词来修饰,并可以有自己的方法体。
接口的默认方法的主要目标之一是解决接口的演化问题。
接口的默认方法的另外一个作用是实现行为的多继承。
通过默认方法,可以创建出类似的帮助接口,即接口中包含的都是通过默认方法实现的帮助方法。
Java 8 接口也可以有静态方法,从职责定位来讲,接口静态方法就是个工具方法。


接口与抽象类

Java之父曾说,若再给他一次设计Java的机会,Java里就不会有抽象类。
总的来说抽象类和接口越来越接近了,是接口向抽象类靠近,剥夺抽象类的生存空间。
<ul>
     <li>抽象类能够定义非static final 的属性(field) ,而接口不能。接口的属性都是static final的。</li>
     <li>抽象类能够定义非public方法,而接口不能。接口的方法都是public的。</li>
     <li>接口可以多继承(实现),而抽象类不能。抽象类只能单继承。</li>
</ul>


常量接口(Constant Interface)

常量接口是只包括常量定义的接口,Java中一直存在“常量接口(Constant Interface)”的用法。通过实现这样的接口,就可以省去常量前的挂靠单位而直接引用这些常量。


静态成员导入Static Import

J2SE 1.5里引入了“Static Import”机制,借助这一机制,可以用略掉所在的类或接口名的方式,来使用静态成员。
在Java程序中,是不允许定义独立的函数和常量(当然,准确的说,只是被final修饰、只能赋值一次的变量)的。即使从它们本身的功能来看,完全不需要依附于什么东西,也要找个类或接口作为挂靠单位才行(在类里可以挂靠各种成员,而接口里则只能挂靠常量)。
挂靠的方法,是把它们加上static修饰符,定义为这个类或接口的静态成员。这方面的典型例子是java.lang.Math类——包含了大量的sin、cos这样的“函数”和PI、E这样的“常量”。
传统上,在访问这些挂靠了的函数、变量和常量的时候,需要在前面加上它们挂靠单位的名称。如果只是偶尔访问这些东西一下,这样的写法可以工作得很好;但是如果要频繁访问这些成员的话,这样的写法就显得比较罗嗦了。
静态成员导入没有常量接口的可以从“一个类实现了哪个接口”推断出“这个类需要使用哪些常量”,即“会暴露实现细节”的问题。
使用import static语句,可以导入一个类里的一切被static修饰的东西,包括变量、常量、方法和内类。在J2SE 1.4以后,无论是import语句,还是import static语句,都要求给一个所在包名出来,对于不属于任何包的类和接口,不能用import导入它本身,也不能用import static导入它的静态成员。
import static 包名.类或接口名.*;
注意这种方式只是指出遇到来历不明的成员时,可以到这个类或接口里来查找,并不是把这个类或接口里的所有静态成员全部导入。
静态成员导入只是语法糖的作用,编译时,所有因Static Import的存在而简化了的名字,都会被编译器打回原型。因此在性能方面,Static Import没有任何影响。
但是名字简化却可能造成一些维护方面的问题。去掉静态成员前面的类型名,虽然有助于在频繁调用时显得简洁,但是同时也失去了关于“这个东西在哪里定义”的提示信息,增加了阅读理解的麻烦。所以这一机制在使用不当的时候可能给维护工作带来一定的困扰。

http://www.cnblogs.com/Fndroid/p/6087380.html

Optional

Optional可以优雅的解决 NullPointException 的问题,它的isPresent() 与 obj != null 功能一样, 没有 isPresent() 作铺垫的 get() 调用在 IntelliJ IDEA 中会收到告警。
而 Optional 中我们真正需要常使用的是除了 isPresent() 和 get() 的其他以下方法:
<pre>
map
orElse
orElseGet
ifPresent
filter
flatMap
orElseThrow
</pre>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值