• jdk1.8新特性之函数式接口


      函数式接口就是只有一个抽象方法的接口。如果这个接口里没有或者包含了两个以上的抽象方法,对不起,你不叫函数式接口,只能叫你接口。那这个函数式有啥用呢?如果配合Lambda表达式的话,可以大大的简化代码。这里不说Lambda,只说函数式接口,先看它长啥样:

    /*
     * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
     * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     */
    
    package java.lang;
    
    /**
     * The <code>Runnable</code> interface should be implemented by any
     * class whose instances are intended to be executed by a thread. The
     * class must define a method of no arguments called <code>run</code>.
     * <p>
     * This interface is designed to provide a common protocol for objects that
     * wish to execute code while they are active. For example,
     * <code>Runnable</code> is implemented by class <code>Thread</code>.
     * Being active simply means that a thread has been started and has not
     * yet been stopped.
     * <p>
     * In addition, <code>Runnable</code> provides the means for a class to be
     * active while not subclassing <code>Thread</code>. A class that implements
     * <code>Runnable</code> can run without subclassing <code>Thread</code>
     * by instantiating a <code>Thread</code> instance and passing itself in
     * as the target.  In most cases, the <code>Runnable</code> interface should
     * be used if you are only planning to override the <code>run()</code>
     * method and no other <code>Thread</code> methods.
     * This is important because classes should not be subclassed
     * unless the programmer intends on modifying or enhancing the fundamental
     * behavior of the class.
     *
     * @author  Arthur van Hoff
     * @see     java.lang.Thread
     * @see     java.util.concurrent.Callable
     * @since   JDK1.0
     */
    @FunctionalInterface
    public interface Runnable {
        /**
         * When an object implementing interface <code>Runnable</code> is used
         * to create a thread, starting the thread causes the object's
         * <code>run</code> method to be called in that separately executing
         * thread.
         * <p>
         * The general contract of the method <code>run</code> is that it may
         * take any action whatsoever.
         *
         * @see     java.lang.Thread#run()
         */
        public abstract void run();
    }

      它最明显的一个标志就是FunctionalInterface注解,如果你使用了FunctionalInterface注解却在接口里写了两个抽象方法,那么编译器是不会放过你的。当然我们也可以不加该注解,只要你满足了一个抽象方法的接口这个标准,那么它仍然是函数式接口:

    /*
     * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
     * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     */
    package java.lang;
    
    import java.util.Iterator;
    import java.util.Objects;
    import java.util.Spliterator;
    import java.util.Spliterators;
    import java.util.function.Consumer;
    
    /**
     * Implementing this interface allows an object to be the target of
     * the "for-each loop" statement. See
     * <strong>
     * <a href="{@docRoot}/../technotes/guides/language/foreach.html">For-each Loop</a>
     * </strong>
     *
     * @param <T> the type of elements returned by the iterator
     *
     * @since 1.5
     * @jls 14.14.2 The enhanced for statement
     */
    public interface Iterable<T> {
        /**
         * Returns an iterator over elements of type {@code T}.
         *
         * @return an Iterator.
         */
        Iterator<T> iterator();
    
        /**
         * Performs the given action for each element of the {@code Iterable}
         * until all elements have been processed or the action throws an
         * exception.  Unless otherwise specified by the implementing class,
         * actions are performed in the order of iteration (if an iteration order
         * is specified).  Exceptions thrown by the action are relayed to the
         * caller.
         *
         * @implSpec
         * <p>The default implementation behaves as if:
         * <pre>{@code
         *     for (T t : this)
         *         action.accept(t);
         * }</pre>
         *
         * @param action The action to be performed for each element
         * @throws NullPointerException if the specified action is null
         * @since 1.8
         */
        default void forEach(Consumer<? super T> action) {
            Objects.requireNonNull(action);
            for (T t : this) {
                action.accept(t);
            }
        }
    
        /**
         * Creates a {@link Spliterator} over the elements described by this
         * {@code Iterable}.
         *
         * @implSpec
         * The default implementation creates an
         * <em><a href="Spliterator.html#binding">early-binding</a></em>
         * spliterator from the iterable's {@code Iterator}.  The spliterator
         * inherits the <em>fail-fast</em> properties of the iterable's iterator.
         *
         * @implNote
         * The default implementation should usually be overridden.  The
         * spliterator returned by the default implementation has poor splitting
         * capabilities, is unsized, and does not report any spliterator
         * characteristics. Implementing classes can nearly always provide a
         * better implementation.
         *
         * @return a {@code Spliterator} over the elements described by this
         * {@code Iterable}.
         * @since 1.8
         */
        default Spliterator<T> spliterator() {
            return Spliterators.spliteratorUnknownSize(iterator(), 0);
        }
    }

      虽然上面接口除了一个抽象方法(接口里方法的默认修饰符是public abstract)外,还有两个默认方法,但它依然满足只有一个抽象方法的标准。除了默认方法,静态方法、Object对象里的方法(接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法),都没关系。

  • 相关阅读:
    h.264的POC计算(转载)
    如何从kernel源码中查出版本号(转载)
    git切换分支保存修改的代码的方法(转载)
    【转载】Gradle for Android 第二篇( Build.gradle入门 )
    【转】gradle for android 第一篇
    android studio学习----android studio断点调试
    maven 学习---Maven配置之pom文件配置包含和排除测试
    maven 学习---Maven 编译打包时如何忽略测试用例
    android studio学习----gradle多渠道打包
    android studio学习----gradle命令详解
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/9084120.html
Copyright © 2020-2023  润新知