30분 입문 Java8의 lambda 표현식 학습

4540 단어 java8lambda
앞말
Google은 올해 Android N 개발자 미리보기를 발표하고 자바 8을 지원하기 시작했다고 발표했다.우리는 마침내 안드로이드 개발에서 자바8의 일부 언어 특성을 사용할 수 있게 되었다.현재 지원:
  • 기본 방법
  • lambda표현식
  • 여러 번 메모
  • 오늘 우리는 간략하게 람다 표현식을 배울 것이다.
    개발 환경 설정
    먼저 JDK1.8을 다운로드하여 설치해야 합니다.
    Android 개발에서 lambda 표현식을 사용하려면 Android Studio에서 Java8 개발 환경을 설정해야 합니다.
    앱의 Gradle 파일을 구성하려면:
  • jack 컴파일 옵션 열기
  • 1.8과 호환되는 컴파일 옵션 설정
  • 
    android {
      defaultConfig {
        ...
        // jack 
        jackOptions {
          enabled true
        }
      }
      ...
      // Java1.8
      compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
      }
    }
    여러 가지 이유로 우리가 사용하는 JDK 버전은 1.7 심지어 더 낮을 수도 있지만, 우리는 람다 표현식을 사용하는 것을 배우고 싶은데, 어떻게 해야 합니까?Github에 이미 개발자가 lambda 표현식부터 자바 7, 6, 5까지 호환되는 소스 라이브러리retrolamda를 설계했다.Android Studio에서 구성하는 방법에 대해서는 더 이상 언급할 필요가 없습니다.참조할 수 있습니다Gradle Retrolambda Plugin.
    첫 번째 lambda 표현식
    아래의 코드를 보면 모두가 매우 익숙할 것이라고 믿는다.버튼에 감청 이벤트를 설정하는 거잖아.
    
     button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            Log.d("TAG"," , ");
          }
        });
    위의 코드를 분석하면 익명 내부 클래스를 통해 Button의 클릭 감청 이벤트를 설정합니다.즉, 우리는 View.OnClickListener 인터페이스를 실현한 익명 클래스의 대상을 만들었다.익명 내부 클래스는 onClick 방법을 실현했다.이 익명 클래스의 대상을 통해 사용자가 단추를 눌렀을 때 로그를 출력합니다.
    그런데 다들 눈치채셨나요?위의 코드가 정말 유용한 것은 바로 Log이다.d("TAG", "버튼 클릭, 익명 내부 클래스");이 줄의 코드는 익명 내부 클래스를 사용하는 단점을 반영한다.
  • 가독성이 떨어지기 때문에 우리의 의도를 직접적으로 명확하게 나타낼 수 없다.
  • 솔, 논리 코드 한 줄에 템플릿 코드 몇 줄이 있다.
  • 그리고 lambda 표현식은 이런 문제들을 잘 해결했다.
    
    button.setOnClickListener(view-> Log.d(TAG," ,lambda "));
     view-> Log.d(TAG," ,lambda ")); 가 바로 우리가 쓴 첫 번째 람다 표현식이다.
    lambda 표현식은 보통 (argument)->(body) 같은 형식으로 쓰인다.
    
    // 
    (arg1,arg2...) -> {body}
    
    // 
    (Type1 arg1,Type2 arg2...)->{body}
    
    lambda 표현식에서 매개 변수의 형식은 생략할 수 있습니다.Java 컴파일러는 표현식의 컨텍스트에 따라 매개변수의 유형을 유도합니다.위 그림에서view의 유형이View인 것처럼.
    lambda 표현식의 구조
  • 매개변수는 0 개 이상일 수 있습니다
  • 매개변수 유형은 지정할 수 있고 생략 가능(표현식 컨텍스트에 따라 추정)
  • 매개변수는 괄호에 포함되며 쉼표로 구분됩니다
  • 표현식 주체는 괄호 안에 포함된 0개 또는 여러 개의 문장일 수 있다
  • 표현식 주체가 한 문장만 있을 때 괄호는 생략 가능
  • 표현식 주체가 상기 문장을 가지고 있을 때 표현식의 반환 유형은 코드 블록의 반환 유형과 일치한다
  • 표현식이 한 문장만 있을 때 표현식의 반환 유형은 이 문장의 반환 유형과 일치한다
  • 
    // 
     ()-> System.out.println("no argument");
     
    // 
     x->x+1
    
    // 
     (x,y)->x+y
    
    // 
     View.OnClickListener oneArgument = view->Log.d(TAG,"one argument");
     // 
     View.OnClickListener oneArgument = (View view)->Log.d(TAG,"one argument");
    
    // 
    // void
    View.OnClickListener multiLine = (View view)->{
       Log.d(TAG,"multi statements");
       Log.d(TAG,"second line");
    }
    
    // int
    (int x)->x+1
    
    lambda 표현식의 유형
    우리는 모두 자바가 강한 유형의 언어라는 것을 안다.모든 방법의 매개 변수는 유형이 있습니다. 그렇다면lambda 표현식은 어떤 유형입니까?
    
     View.OnClickListener listener = new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            //...
          }
        };
        
     button.setOnClickListener(listener);
    위에서 보듯이 이전에 우리는 단일한 방법의 인터페이스를 사용하여 하나의 방법을 대표하고 그것을 다시 사용했다.
    lambda 표현식에서 이전과 같은 형식을 사용합니다.우리는 함수식 인터페이스(functional interface)라고 부른다
    이전 button의 클릭 응답 이벤트에 사용된 View와 같습니다.OnClickListener는 함수식 인터페이스입니다.
    
    public class View implements Drawable.Callback, KeyEvent.Callback,
        AccessibilityEventSource {
        ...
     public interface OnClickListener {
        void onClick(View v);
      }
      ...
      }
    그러면 도대체 어떤 인터페이스가 함수식 인터페이스입니까?
    함수식 인터페이스는 추상적인 방법만 있는 인터페이스다.lambda 표현식을 나타내는 형식으로 사용됩니다.
    Java8 API에 여러 함수 인터페이스가 추가되었습니다.
    인터페이스 이름
    매개 변수
    반환값
    용도
    Predicate
    T
    boolean
    단언
    Consumer
    T
    void
    소비하다
    Function
    T
    R
    함수
    Supplier
    None
    T
    공장 방법
    UnaryOperator
    T
    T
    논리적 비
    BinaryOperator
    (T,T)
    T
    이원 조작
    이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기