.1 Lambda表达式和函数式接口
它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理
最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:
Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );
java.lang.Runnable和java.util.concurrent.Callable是函数式接口的最佳例子
@FunctionalInterface public interface FunctionalDefaultMethods { void method(); default void defaultMethod() { } }
2.重复注解
public class RepeatingAnnotations { @Target( ElementType.TYPE ) @Retention( RetentionPolicy.RUNTIME ) public @interface Filters { Filter[] value(); } @Target( ElementType.TYPE ) @Retention( RetentionPolicy.RUNTIME ) @Repeatable( Filters.class ) public @interface Filter { String value(); }; @Filter( "filter1" ) @Filter( "filter2" ) public interface Filterable { } public static void main(String[] args) { for( Filter filter: Filterable.class.getAnnotationsByType( Filter.class ) ) { System.out.println( filter.value() ); } } }
3.接口中的默认和静态方法
Java 8对接口进行了增强,允许接口具有已经实现了的方法。我们可以使用default 和static 关键字来创建带实现方法的接口。例如Iterable接口中的forEach方法便是一个默认方法
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }