lambda表达式(jdk1.8新增)的一步步演化:

package com.smile.test.lambda;

public class LambdaTest {
    // step3:静态内部类
    static class B implements Study{
        @Override
        public void study(String subject) {
            System.out.println("study" + subject);
        }
    }
    public static void main(String[] args) {
        // step4:局部内部类
        class C implements Study{
            @Override
            public void study(String subject) {
                System.out.println("study" + subject);
            }
        }

        A a = new A();
        a.study("java");

        B b = new B();
        b.study("python");

        C c = new C();
        c.study("C");

        // step5:匿名内部类
        Study study = new Study() {
            @Override
            public void study(String subject) {
                System.out.println("study" + subject);
            }
        };
        study.study("C++");

        // step6:lambda表达式
        Study study1 = (String subject)->{
            System.out.println("study" + subject);
        };
        study1.study("golang");

        // 简化lambda表达式, 参数类型可省略,只有一个参数时,括号可省略,多个参数时,参数类型要不都写,要不都不写;
        // 方法体只有一句代码时, {}可省略,否则不能省略.
        Study study2 = subject -> System.out.println("study" + subject);
        study2.study("Math");
    }
}
// step1:定义一个函数式接口(接口中,有且仅有一个抽象方法)
interface Study{
    void study(String subject);
}
// step2:抽象接口的实现类
class A implements Study{
    @Override
    public void study(String subject) {
        System.out.println("study" + subject);
    }
}
studyjava
studypython
studyC
studyC++
studygolang
studyMath

Process finished with exit code 0

函数式接口----可以对比Runnable接口源码:
指内部有且仅有一个抽象方法的接口。

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();
}