아래에서 우리는 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 (새 소비자 <integer> () {@override public void accept (정수 정수) {System.out.println (Integer);}}); }}이 프로그램은 간단하고 먼저 정수 유형 모음을 초기화 한 다음 각 요소를 콘솔에 출력합니다. 그중에서도 Java 8의 새로 추가 된 기본 메소드 인 Foreach 메소드를 발견했습니다.
공개 인터페이스 반복 가능 <t> {. . 생략. 기본 void foreach (소비자 <? super t> action) {objects.requirenonnull (action); for (t t : this) {action.accrect (t); }}}반복 가능한 인터페이스에서 선언되며 키워드 기본값으로 수정됩니다. 이러한 방식으로,이 인터페이스의 모든 하위 유형은 Foreach 메소드의 구현을 상속 할 수 있으므로 목록 인터페이스는 반복 가능의 간접 하위 인터페이스이므로 기본 메소드도 상속합니다. Java8은 인터페이스의 기능을 확장하는이 영리한 방법을 채택하고 이전 버전과 호환됩니다.
다음으로 Foreach의 구현을 분석합니다. 먼저, 소비자 유형의 매개 변수 조치를 받고, 비어 있지 않은 판단을 수행 한 다음 모든 현재 요소를 가로 지르고 처리를위한 작업 수락 방법으로 넘겨줍니다. 그래서 대체 소비자는 무엇입니까? 소스 코드를보십시오
@functionalInterFacePublic Interface Consumer <t> { /*** 주어진 인수 에서이 작업을 수행합니다. * * @param t 입력 인수 */ void acccept (t t); . .omitted.} 하나의 추상 방법 만있는 인터페이스는 일반적인 기능 인터페이스 인 @functionalinterface에 의해 수정됩니다.
자, 이제 우리는 Foreach에서 수신 한 소비자 유형의 매개 변수가 기능 인터페이스라는 것을 알고 있습니다. 인터페이스에서 유일한 수락 추상 방법은 매개 변수를 수신하고 값을 반환하지 않습니다. 이전 기사에서 기능 인터페이스 유형의 인스턴스를 생성하는 방법 중 하나는 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 expression은 값 목록을 반환하지 않고 매개 변수를 수신합니다. }} Lambda 표현 항목 -> System.out.println (항목)은 값을 반환하지 않고 매개 변수를 수신하고 수락 방법 서명 요구 사항을 충족하며 컴파일 및 전달됩니다.
즉, 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); // 메소드 참조 목록 .foreach (System.out :: println); }} 나는 뒤에 두 개의 사유가 보였지만 어쨌든 나는 엉망이었다. . . 기능 인터페이스 인스턴스를 만드는 두 번째 방법입니다. 메소드 참조 메소드 참조 구문은 Object :: 메소드 이름입니다.
마찬가지로, 메소드 참조 방법을 사용하여 기능 인터페이스 인스턴스를 생성하는 것도 메소드 서명의 정의를 준수해야합니다. 여기에서 println 메소드 소스 코드를 참조하십시오
public void println (object x) {string s = string.valueof (x); 동기화 (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); // 생성자 메소드 참조 목록 .foreach (test1 :: new); } test1 (정수 i) {System.out.println (i); }} 생성자가 참조하는 구문은 다음과 같습니다. 클래스 이름 :: new
우리는 매개 변수를 수신하는 Test1에 새 생성자를 추가했습니다. 이는 값을 반환하지 않고 컴파일합니다. (생성자 인용의 사용을 보여 주려면)
이전 기사를 기반으로 기능 인터페이스 유형을 만드는 세 가지 방법을 요약 할 수 있습니다.
1. 람다 표현
2. 방법 인용
3. 생성자 메소드 참조
참고 : 어떤 메소드에 관계없이, 메소드 서명은 추상 메소드와 일치해야합니다.