Java 8 特性

java-8-tutorial

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

默认方法用default修饰,默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。接口提供的默认方法会被接口的实现类继承或者覆写。

如果有两个接口中的静态方法一模一样,并且一个实现类同时实现了这两个接口,此时并不会产生错误,因为jdk8只能通过接口类调用接口中的静态方法,所以对编译器来说是可以区分的。但是如果两个接口中定义了一模一样的默认方法,并且一个实现类同时实现了这两个接口,那么必须在实现类中重写默认方法,否则编译失败。

函数式接口

只有一个抽象方法的接口,用@FunctionalInterface注解接口。
JDK8函数式接口Function、Consumer、Predicate、Supplier

Lambda表达式、方法引用

不赘述了,实现原理就是用了函数式接口。

重复注解

在注解类上添加@Repeatable
JDK8新特性之重复注解

反射获取方法中的参数名

使用反射API和Parameter.getName()方法。
这个特性是默认关闭的,需要在javac编译的时候带上-parameters

package com.javacodegeeks.java8.parameter.names;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class ParameterNames {
    public static void main(String[] args) throws Exception {
        Method method = ParameterNames.class.getMethod( "main", String[].class );
        for( final Parameter parameter: method.getParameters() ) {
            System.out.println( "Parameter: " + parameter.getName() );
        }
    }
}

/**
* 不加-parameters: Parameter: arg0
* 加了-parameters: Parameter: args
*/

Optional

Optional是一个容器:存放T类型的值或者null。它提供了一些有用的接口来避免显式的null检查

Optional 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!" ) );

/*
Full Name is set? false
Full Name: [none]
Hey Stranger!
*/

Optional< String > firstName = Optional.of( "Tom" );
System.out.println( "First Name is set? " + firstName.isPresent() );        
System.out.println( "First Name: " + firstName.orElseGet( () -> "[none]" ) ); 
System.out.println( firstName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );

/*
First Name is set? true
First Name: Tom
Hey Tom!
*/

Streams

java8-stream-tutorial-examples
Streams API 详解

Date / Time

Clock类使用时区来返回当前的纳秒时间和日期。Clock可以替代System.currentTimeMillis()TimeZone.getDefault()

// Get the system clock as UTC offset 
final Clock clock = Clock.systemUTC();
clock = Clock.systemDefaultZone();
System.out.println( clock.instant() );
System.out.println( clock.millis() );

System.out.println(ZoneId.getAvailableZoneIds());
ZoneId zone = ZoneId.of("Asia/Shanghai");
LocalTime now = LocalTime.now(zone);
System.out.println(now);
// 16:50:27.527
LocalTime late = LocalTime.of(23, 59, 59);
System.out.println(late);  
// 23:59:59

LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);
LocalDate yesterday = tomorrow.minusDays(2);

LocalDate independenceDay = LocalDate.of(2018, Month.JULY, 4);
DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();
System.out.println(dayOfWeek);    // WEDNESDAY

JVM

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

你可能感兴趣的:(Java 8 特性)