Java8的新特性

JVM的新特性

使用Metaspace(JEP 122)代替持久代(PermGen space)。在JVM参数方面,使用-XX:MetaSpaceSize和-XX:MaxMetaspaceSize代替原来的-XX:PermSize和-XX:MaxPermSize。

Lambda表达式和函数式接口
Lambda

说到 lambda 我之前有篇文章就说过,说到底就是匿名内部类的简化写法。可能其他函数式开发者就比较熟悉,很多JVM平台上的语言(Groovy、Scala等)从诞生之日就支持Lambda表达式,但是Java开发者很多还没用过,使用匿名内部类代替Lambda表达式~
为了让现有的功能与Lambda表达式良好兼容,于是就有了函数接口。函数接口指的是只有一个函数的接口,这样的接口可以隐式转换为Lambda表达式。java.lang.Runnable和java.util.concurrent.Callable是函数式接口的最佳例子。在实践中,函数式接口非常脆弱:只要某个开发者在该接口中添加一个函数,则该接口就不再是函数式接口进而导致编译失败。为了克服这种代码层面的脆弱性,并显式说明某个接口是函数式接口,Java 8 提供了一个特殊的注解@FunctionalInterface(Java 库中的所有相关接口都已经带有这个注解了),举个简单的函数式接口的定义:

@FunctionalInterface
public interface DemoFunctional{
    void method();
    default void defaultMethod() {            
    }        
}
Streams

新增的Stream API(java.util.stream)将生成环境的函数式编程引入了Java库中。
因为内容比较多后续我会单独新写文字单独介绍。

接口的默认方法和静态方法

默认方法使得开发者可以在不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时实现这个新加的方法。
默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。接口提供的默认方法会被接口的实现类继承或者覆写:

@FunctionalInterface
private interface Demo {
    // Interfaces now allow default methods, the implementer may or 
    // may not implement (override) them.
    default String doSomeThing() { 
        return "OK!"; 
    }        
}
        
private static class DemoImpl implements Demo {
}
    
private static class OverridableImpl implements Demo {
    @Override
    public String doSomeThing() {
        return "Are you OK?";
    }
}

静态方法由于JVM上的默认方法的实现在字节码层面本身就提供了支持,因此效率非常高。默认方法允许在不打破现有继承体系的基础上改进接口:

private interface DemoFactory {
    // Interfaces now allow static methods
    static Demo create( final Supplier<Demo> supplier ) {
        return supplier.get();
    }
}
方法引用

方法引用使得开发者可以直接引用现存的方法、Java类的构造方法或者实例对象。方法引用和Lambda表达式配合使用,使得java类的构造方法看起来紧凑而简洁,没有很多复杂的模板代码:

private interface DemoFactory {
    // Interfaces now allow static methods
    static Demo create( final Supplier<Demo> supplier ) {
        return supplier.get();
    }
    
    public void delete() {   
        System.out.println( "delete " + this.toString() );
    }
}

public static void main( String[] args ) {
	// 第一种方法构造引用,语法是Class::new
    final Demo demo = DemoFactory.create( Demo::new );
    // 第二种方法方法引用,语法是Class::static_method / method。
	DemoFactory::delete;
}
重复注解

java8以前(java5以上)在同一个地方不能多次使用同一个注解。Java 8取消了这个限制,允许在同一个地方多次使用同一个注解,使用@Repeatable注解定义重复注解。另外,反射API提供了一个新的方法:getAnnotationsByType(),可以返回某个类型的重复注解。

类型推断
package com.javacodegeeks.java8.type.inference;

public class Value< T > {
    public static< T > T defaultValue() { 
        return null; 
    }
    
    public T getOrDefault( T value, T defaultValue ) {
        return ( value != null ) ? value : defaultValue;
    }
}
Optional

官方库加入了谷歌的Optional,用来存放T类型的值或者null。它提供了一些有用的接口来避免显式的null检查。如果Optional实例持有一个非空值,则isPresent()方法返回true,否则返回false;orElseGet()方法,Optional实例持有null,则可以接受一个lambda表达式生成的默认值;map()方法可以将现有的Opetional实例的值转换成新的值;orElse()方法与orElseGet()方法类似,但是在持有null的时候返回传入的默认值。

Optional< String > fullName = Optional.ofNullable( null );
System.out.println( "Full Name is set? " + fullName.isPresent() );        
System.out.println( "Full Name: " + fullName.orElseGet( () -> "[none]" ) ); 
System.out.println( fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
Date/Time API

这个工具就看源码就好这里不做介绍

Nashorn JavaScript引擎

Java 8提供了新的Nashorn JavaScript引擎,使得我们可以在JVM上开发和运行JS应用。Nashorn JavaScript引擎是javax.script.ScriptEngine的另一个实现版本,这类Script引擎遵循相同的规则,允许Java和JavaScript交互使用。

ScriptEngine engine = ScriptEngineManager::getEngineByName( "JavaScript" );
System.out.println( "Result:" + engine.eval( "function f() { return 1; }; f() + 1;" ) );
// 输出 -> Result: 2
Base64

对Base64编码的支持已经被加入到Java 8官方库中。新的Base64API也支持URL和MINE的编码解码。Base64.getUrlEncoder() / Base64.getUrlDecoder() / Base64.getMimeEncoder() / Base64.getMimeDecoder()

并行数组

Java8版本新增了很多新的方法,用于支持并行数组处理。最重要的方法是parallelSort(),可以显著加快多核机器上的数组排序。

并发

基于新增的lambda表达式和steam特性,为Java 8中java.util.concurrent.ConcurrentHashMap类添加了新的方法来支持聚焦操作;另外,也为java.util.concurrentForkJoinPool类添加了新的方法来支持通用线程池操作等。这里内容较多,后续我单独新写对 java并发包的解析。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值