2014년 3월 출시, 2020년 기준 83%의 점유율
LTS(오랜 기간 업데이트를 제공) / 자바 11도 LTS
Non-LTS의 경우 다음 버전 출시 시(약 6개월 주기) 업데이트 ❌
추상 메서드를 딱 하나만 가지고 있는 SAM (Single Abstract Method) 인터페이스
static/default 메서드는 있어도 가능
@FuncationInterface 애노테이션을 가지고 있는 인터페이스
@FunctionalInterface 
public interface RunSomething {
    void doIt();
    static void printName() {
        System.out.println("Hong");
    }
    default void printAge() {
        System.out.println("25");
    }
}함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰임, 코드를 줄일 수 있다
메서드 매개변수, 리턴 타입, 변수로 만들어 사용 가능
    // 자바 8 이전
    public static void main(String[] args) {
        
        // 익명 내부 클래스 (anonymous inner class), 자바 8이전
        RunSomething runSomething1 = new RunSomething() {
            @Override
            public void doIt() {
                System.out.println("Hello");
            }
        };
		//여기부터 자바 8
        RunSomething runSomething2 = () -> System.out.println("Hello");
        RunSomething runSomething3 = Foo::doIt;
        RunSomething runSomething4 = () -> {
            System.out.println("Hello");
            System.out.printf("Hong");
        };
        runSomething1.doIt();
        runSomething2.doIt();
        runSomething3.doIt();
        runSomething4.doIt();
    }
    private static void doIt() {
        System.out.println("Hello");
    }
함수형 프로그래밍은 다음 조건을 만족해야 한다.
과거 자바에서 Method는 변수에 담을 수 없었다.
모던 자바에서는 가능해짐. 함수를 하나의 객체로 취급
사이드 이펙트가 없다 (함수 밖에 있는 값을 변경하지 않는다)
상태가 없다 (함수 밖에 있는 값을 사용하지 않는다)
    @FunctionalInterface
    public interface RunSomthing {
        int doIt(int number);
    }
    public class Foo {
        public static void main(String[] args) {
          RunSomthing runSomthing = (number) -> {
  			  return number + 10;
          }
          runSomthing.doIt(1); // 11
          runSomthing.doIt(1); // 11
 
        }
        
    }⇒ 이를 보장하지 못하면, 함수형 프로그래밍 ❌
  @FunctionalInterface
  public interface RunSomthing {
  	  int doIt(int number);
  }
  public class Foo {
    public static void main(String[] args) {
      RunSomthing runSomthing1 = new RunSomthing() {
        int baseNumber = 10;
        @Override
        public int doIt(int number) {
            baseNumber++; // 1) 외부의 값 변경
            return number + baseNumber; // 2) 외부의 값 사용
        }
      };
    }
    
  }