자바 8 의 새로운 문법 적 특성 도입 에 대한 간략 한 설명

6230 단어 Java 8
자바 8 의 문법 적 개선 은 Lambda Expression 과 Method Reference 를 추가 한 것 이다.공식 홈 페이지 의 소개 가 다소 수 다스 럽 고 예 도 복잡 하기 때문이다.저 는 자바 8 이 새로 도입 한 문법 적 특성 을 이해 하 는 데 더욱 간단명료 하고 직관 적 인 예 를 제공 할 것 입 니 다.
자바 8 의 람 다 익 스프 레 션 은 C,C++와 다르다.Apple 은 LLVM Clang 을 위해 Blocks 문법 특성 을 새로 개발 하여 GNU 99 표준 C 컴 파일 러 가 Clang 컴 파일 러 에서 Lambda Expression 을 사용 할 수 있 도록 했다.C++는 C++11 표준 에 람 다 표현 식 을 도입 했다.Clang 은 Lambda 표현 식 에 새로운 유형 인(^)()을 정의 합 니 다.이러한 정의 방식 은 함수 포인터 와 매우 유사 하 며,이것 은 Lambda 표현 식 의 함수 호출 서명 을 뚜렷하게 나타 낸다.
C++11 은[capture>]()->{}을 사용 하여 람 다,자바 8 과 유사 하 다 고 정의 합 니 다.그러나 C++11 의 반환 형식 은 바로 auto 입 니 다.std:function 을 사용 하지 않 으 면 구체 적 인 lambda 표현 식 형식 을 직접 포착 할 수 없습니다.
자바 8 은 남 다른 방식 을 사용 했다.인 터 페 이 스 를 정의 한 다음 인 터 페 이 스 를 Lambda 표현 식 으로 참조 할 수 있 습 니 다.이 인 터 페 이 스 는 물론 제한 이 있 습 니 다.즉,함수 인터페이스 여야 합 니 다!함수 인터페이스 란 무엇 입 니까?즉,하나의 interface 는 추상 적 인 방법 만 있 는 인 터 페 이 스 를 함수 인터페이스(functional interface)라 고 한다.그리고 lambda 표현 식 의 실 체 는 다음 과 같이 정의 합 니 다.(<매개 변수 목록>)->{}.그 중에서 매개 변수 목록 은 함수 인터페이스 에서 유일한 추상 적 인 방법의 매개 변수 목록 과 일치 해 야 하고 반환 유형 은 이 추상 적 인 방법의 반환 유형 을 직접 가 져 옵 니 다.또한 자바 의 Lambda 표현 식 은 C++의 lambda 및 Blocks 처럼 외부 함수 의 부분 변 수 를 참조 하여 내부 에서 외부 함수 의 부분 변 수 를 직접 수정 할 수 없습니다.그러나 final 변 수 는 가 져 올 수 있 습 니 다.이것 은 익명 의 대상 을 만 드 는 것 과 같 습 니 다.
비록 이런 형식 은 좀 기발 하지만,다행히 너무 번 거 로 운 편 은 아니다.자바 가 C++나 Objective-C 보다 진심으로 수 다 를 떨 기 때문이다.이번에 Method Reference 가 생 긴 후 많은 디자인 을 간소화 할 수 있 습 니 다.다음 예 에서 도 이 점 을 보 여 준다.
package src;

import java.util.ArrayList;

interface MyLambdaFunc {
    public void call(int p);
}

class MyClass {
    
    public static void helloStaticMehtod(int a) {
        System.out.println("Static method value is: " + a);
    }
    
    public void memberMethod(int a) {
        System.out.println("Member method is: " + a);
    }
    
    public void method1(int a) {
        System.out.println("Method 1:" + (a + 1));
    }
    
    public void method2(int a) {
        System.out.println("Method 2: " + (a + 2));
    }
    
    public void method3(int a) {
        System.out.println("Method 3: " + (a + 3));
    }
}

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("Hello, world");
        
        // Type inference
        ArrayList<String> arr = new ArrayList<>();
        arr.add("hello");
        
        // Lambda Expression test
        final int a = 10;
        
        MyLambdaFunc lambda = (p) -> {
            System.out.println("The value is: " + (a + p)); 
            };

        lambda.call(100);
// Method Reference test
        MyLambdaFunc methodRef = MyClass::helloStaticMehtod;
        methodRef.call(-100);
        
        MyClass mlc = new MyClass();
        methodRef = mlc::memberMethod;
        methodRef.call(-200);
        
        MyLambdaFunc methodList[] = { mlc::method1, mlc::method2, mlc::method3 };
        methodList[0].call(100);
        methodList[1].call(100);
        methodList[2].call(100);
    }
}

 

좋은 웹페이지 즐겨찾기