TechEmpower是位于加利福尼亚州埃尔塞贡多的一家定制应用开发公司,该公司发表了一篇题为“Java 8全面解析”的博客文章。该博客文章全面概括了开发者在即将到来的Java 8中所要面对的变化。下面的内容快速概括了该博客文章中的信息。如果想查看所有的细节请访问TechEmpower的博客文章。 改进接口现在可以在接口中定义静态方法了。例如,java.util.Comparator接口中现在拥有一个静态的naturalOrder方法。 public static <T extends Comparable<? super T>> Comparator <T>naturalOrder() { return (Comparator<T>) Cmparators.NaturalOrderComparator.INSTANCE; } 还能够在接口中提供默认方法。通过该功能,程序员能够在不破坏已有的接口实现代码的前提下添加新方法。例如,java.lang.Iterable接口现在拥有一个默认的forEach方法。 public default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } 注意,接口不能为Object类中的任何方法提供默认的实现。 函数式接口函数式接口是只定义了一个抽象方法的接口。Java 8引入了FunctionalInterface注解来表明一个接口打算成为一个函数式接口。例如,java.lang.Runnable就是一个函数式接口。 @FunctionalInterface public interface Runnable { public abstract void run(); } 注意,不管FunctionalInterface注解是否存在,Java编译器都会将所有满足该定义的接口看作是函数式接口。 Lambda函数式接口的重要属性是:我们能够使用lambda实例化它们,Lambda表达式让你能够将函数作为方法参数,或者将代码作为数据对待。下面是Lambda的一些例子。输入在左边,代码在右边。输入类型能够被推断出来,同时是可选的。 (int x, int y) ->{ return x + y; } (x, y) -> x + y x -> x * x () -> x x -> { System.out.println(x); } 下面是实例化Runnable函数式接口的一个例子。 Runnable r = () ->{ System.out.println("Running!"); } 方法引用方法引用是简洁的Lambda表达式,能够用于已经拥有名称的方法。下面是一些方法引用的例子,右边是同样效果的Lambda表达式。 String::valueOf x ->String.valueOf(x) Object::toString x ->x.toString() x::toString () ->x.toString() ArrayList::new () -> new ArrayList<>() 与捕获相对的非捕获Lambda如果使用Lambda表达式访问一个在Lambda语句体外定义的非静态变量或者对象,那么它会被说成是“捕获”。例如,下面的Lambda会访问变量x: int x = 5; return y -> x + y; 一个Lambda表达式仅能够访问final或者有效final封闭块中的局部变量和参数。 java.util.function 新版本向 java.util.function包中添加了很多新的函数式接口。下面是一些例子:
|