Java8特性

  1. Lambda 表达式
  2. 方法引用
  3. 函数式接口
  4. 默认方法
  5. Stream
  6. Optional 类
  7. Nashorn, JavaScript 引擎
  8. 新的日期时间 API
  9. Base64

Lambda 表达式

语法糖,允许把函数作为一个方法的参数。
配合函数式接口食用效果更佳。

       new Thread(()->{
           System.out.println("lambda!");
       }).start();

方法引用

用法:

  • 对象引用::实例方法名
  • 类名::静态方法名
  • 类名::实例方法名
  • 类名::new (构造方法)
public class Main {

    public static void fun(int x){
        System.out.println(x*x);
    }

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        list.forEach(Main::fun);
    }
}

函数式接口

有且仅有一个抽象方法,但是有多个非抽象方法的接口。
java自带的函数式接口举例:

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.util.Comparator
  • ……等等~

自己创建的接口只要满足只有一个抽象方法的条件,都可以当做函数式接口来用。

但是建议使用@FunctionalInterface注解来标注,可用于编译级错误检查,当不符合函数式接口定义的时候,编译器会报错。可以避免在后续版本中因为对接口的修改导致其不符合函数式接口的条件,而在运行时报错。

@FunctionalInterface
interface FunctionalInterfaceTest{
    void fun(Object obj);
}

默认方法

让接口有不用子类去实现的默认方法。

用法:在方法的修饰符前加上default关键字,并给出该方法的默认实现。

interface DefaultFunctionTest{
    default void fun(Object obj){
        System.out.println(obj.toString());
    }
}

Stream

能极大提高Java程序员生产力的特性!
将数据看做一个流,能非常方便的对数据进行过滤、排序、聚合等操作。

        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add((int) (Math.random() * 50));
        }
        list.stream()
                .filter((x) -> x>25)
                .sorted()
                .map(x->x*x)
                .forEach(System.out::println);

Optional 类

可以用来包装一个值的容器,可以很方便的用于对数据进行空值的检测。

public class Main {

    // 非空就输出
    public static void optionalTest(Optional<String> opt){
        opt.ifPresent(System.out::println);
    }

    public static void main(String[] args) {

        optionalTest(Optional.empty());
        optionalTest(Optional.of("test"));
    }
}

Nashorn, JavaScript 引擎

一个新的JavaScript引擎,相比旧版本的Rhino,有更大的性能提升。

新的日期时间 API

新版的日期时间api在java.time包下面,相比java.utiljava.sql中的日期时间处理接口,新增了时区相关的处理,并且改善接口的设计。

        // 解析
        System.out.println(LocalTime.parse("12:30:00"));
        // 日期时间
        System.out.println(LocalDateTime.now());
        // 时区
        System.out.println(ZonedDateTime.now());

Base64

内置的用于Base64编码相关的工具。