인스턴스 상세 Java8 함수식 인터페이스

다음은 계속해서 Java8 함수식 프로그래밍 모델에 깊이 들어가겠습니다.

public class Test1 {
  public static void main(String[] args) {
    List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    list.forEach(new Consumer<Integer>() {
      @Override
      public void accept(Integer integer) {
        System.out.println(integer);
      }
    });
  }
}
이 프로그램은 간단합니다. 우선 Integer 형식의 집합을 초기화하고 컨트롤러에 모든 요소를 출력합니다.그 중에서 우리는 forEach 방법이 Java8에 새로 추가된 기본 방법이라는 것을 알아차렸다.

public interface Iterable<T> {
  .
  . 
  .
  default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
      action.accept(t);
    }
  }
}
이것은 Iterable 인터페이스에 선언되고 키워드 default에 의해 수정됩니다.이렇게 하면 모든 이 인터페이스의 하위 유형은forEach 방법의 실현을 계승할 수 있기 때문에List 인터페이스는Iterable의 간접 하위 인터페이스이기 때문에 이 기본 방법도 계승되었다.Java8은 이러한 교묘한 방식으로 인터페이스의 기능을 확장할 뿐만 아니라 오래된 버전도 호환한다.
다음에 forEach의 실현을 분석하고 우선consumer 유형의 매개 변수 action을 받아들여 비공식 판단을 한 다음에 현재 모든 요소를 action의accept 방법으로 처리한다.그럼 Consumer는 또 뭐야? 원본 봐.

@FunctionalInterface
public interface Consumer<T> {

  /**
   * Performs this operation on the given argument.
   *
   * @param t the input argument
   */
  void accept(T t);
  .
  . 
  .
}
@FunctionalInterface에 의해 수식되고 전형적인 함수식 인터페이스가 있는 인터페이스
ok, 이제 우리는 forEach가 수신한Consumer 형식의 매개 변수는 함수식 인터페이스이고 인터페이스에서 유일한accept 추상적인 방법으로 매개 변수를 수신하고 값을 되돌려 주지 않는다는 것을 알고 있습니다.그러면 이전 문장을 통해 우리는 함수식 인터페이스 유형을 만드는 실례 중 하나가 Lambda 표현식을 사용하기 때문에 맨 위의 프로그램을 개조할 수 있다는 것을 알았다

public class Test1 {
  public static void main(String[] args) {
    List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    //Lambda     
    list.forEach(item -> System.out.println(item));
  }
}
이 lambda 표현식 item-> 시스템.out.println (item) 은 매개 변수가 값을 되돌려 주지 않고 accept 방법의 서명 요구에 부합되며 컴파일이 통과됩니다.
즉, 만약lambda표현식을 사용하여 함수식 인터페이스 실례를 만들면, 이 lambda표현식의 삽입과 반환은 이 함수식 인터페이스에서 유일한 추상적인 방법에 부합되는 방법으로 서명해야 한다.
다음에 다시 절차를 개조할 것이다

public class Test1 {
  public static void main(String[] args) {
    List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    // 
    list.forEach(System.out::println);
  }
}
아웃 뒤에 짝퉁이 두 개 있는 걸 봤어요. 어쨌든 그때 제가 혼란스러웠어요...이것이 바로 함수식 인터페이스 실례 두 번째 창설 방식입니다. 방법 인용 방법이 인용한 문법은 대상입니다. 방법명:
마찬가지로 방법 인용 방식을 사용하여 함수식 인터페이스를 만드는 실례도 방법 서명의 정의를 준수해야 합니다. 여기 println 방법 원본을 보십시오

public void println(Object x) {
  String s = String.valueOf(x);
  synchronized (this) {
    print(s);
    newLine();
  }
}
매개 변수를 수신하고 값을 되돌려 주지 않습니다. 컴파일이 통과되었습니다.
마지막으로 함수식 인터페이스를 만드는 마지막 방법, 세 번째 방식: 구조 방법 인용, 프로그램 계속 변경

public class Test1 {
  public static void main(String[] args) {
    List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    // 
    list.forEach(Test1::new);
  }
  
  Test1(Integer i){
    System.out.println(i);
  }
}
구조 방법 인용 문법: 클래스 이름::new
우리는 Test1에 구조 방법을 새로 추가했습니다. 이 구조 방법은 매개 변수를 수신하고 값을 되돌려 주지 않으며 컴파일이 통과되었습니다.(전시 구조 방법에만 인용하는 용법)
이전 문장과 결합하여 함수식 인터페이스 유형을 만드는 세 가지 방식을 요약할 수 있다.
1. lambda 표현식
2. 메소드 참조
3. 구조 방법 인용
주의: 어떤 방식이든 추상적인 방법에 부합되는 서명을 해야 한다

좋은 웹페이지 즐겨찾기