>  기사  >  Java  >  Java 8을 사용하는 Android의 새로운 기능인 Lambda 표현식의 샘플 코드에 대한 자세한 소개

Java 8을 사용하는 Android의 새로운 기능인 Lambda 표현식의 샘플 코드에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-11 11:54:451943검색

머리말

java8의 새로운 기능인 람다 표현식입니다. Lambda 표현식을 사용하면 인터페이스 구현을 단 하나의 함수로 대체하고 익명의 내부 클래스에 작별을 고할 수 있으며 코드가 더 간결하고 이해하기 쉬워 보입니다.
Java8에는 다른 새로운 기능도 있지만 Android에서는 사용하지 못할 수도 있습니다.
Studio 2.x 이상에서는 jack 컴파일러를 지원합니다. 이를 사용하면 java8의 Lambda 표현식을 사용할 수 있지만 다른 기능을 사용할 수 있다는 보장은 없습니다.

참고: Android SDK는 JDK의 일부 소스 코드를 통합합니다. 기본 JDK의 일부 클래스에는 새로운 기능이 추가될 수 있지만 Android의 클래스는 그렇지 않습니다. 또 다른 예는 java8의 java.util.function 패키지로, 하위 버전에서는 사용할 수 없습니다.

플러그인 Retrolambda를 사용하여 java8의 Lambda 표현식을 지원할 수도 있습니다.

Jack 구성

다음 구성을 추가

android {
    jackOptions {
        enabled true
    }
    compileOptions {//jack、retrolambda编译必需        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

jack 컴파일러가 Lambda 표현식을 지원하도록 활성화

최신 버전 2.3 스튜디오를 사용하세요. jdk 1.8 환경, gradle2.3 및 위 구성
테스트 후에는 4.4 시뮬레이터에서도 실행할 수 있습니다
구성 데모: http://www.php.cn/

retrolambda 구성

retrolambda는 Lambda 표현식을 사용하여 java5, 6 및 7과 호환됩니다.

구성은 다음과 같습니다

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'me.tatarka:gradle-retrolambda:3.6.0'
    }}
apply plugin: 'me.tatarka.retrolambda'android {
    defaultConfig {
        minSdkVersion 11 //这个没有硬性要求
    }
    compileOptions {//jack、retrolambda编译必需
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }}

참고: 많은 오픈 소스 프로젝트에서 여전히 레트로람다를 사용합니다

람다 표현식 사용 방법

먼저 우리가 알아야 할 것은 표현이 전체적으로 "객체형"을 표현한다는 것이다.

가장 간단한 람다 표현식

코드:

Runnable runnable = () -> System.out.println("hi, 我是 stone");runnable.run();

()는 실제로 메소드 매개변수 목록입니다. 여기에 매개변수가 전달되지 않으면 매개변수 없이 메소드와 일치하므로 Runnable입니다. void run()이 하나만 있으므로 일치하게 됩니다. 메서드 이름은 여기에 기록되지 않으므로 메서드 이름은 무시됩니다.

-> 메소드 본문이 이어집니다. 여기에는 인쇄 코드 문장이 하나만 있습니다. 메서드 본문의 중괄호({})를 생략할 수 있습니다.

참고: 컴파일러가 자동 유형 추론을 수행하므로 "new Runnable"과 같은 코드도 여기서 생략됩니다. ()를 직접 호출하면 -> System.out.println(“hi, I am Stone”).run(); 컴파일러가 해당 메서드를 찾을 클래스를 알 수 없기 때문에 컴파일되지 않습니다. >

매개변수와 반환 값이 포함된 람다 식

코드:

button.setOnTouchListener((view, event)-> {    
if (event.getAction() == MotionEvent.ACTION_DOWN) {        
if (flag) {            
return true;
        }
    }    return super.onTouchEvent(event);
});

매개변수가 있는 경우 매개변수 이름만 전달하면 이름은 유형에 따라 정의될 수 있습니다. 정의되었거나 정의되지 않았습니다. 둘 중 하나라도 괜찮습니다. 정의되지 않은 경우 컴파일러가 자동으로 추론합니다.

반환 값이 있는 경우 메소드 본문에서 return을 사용할 수 있습니다. 다음과 같이 코드만 있는 경우 return을 생략할 수도 있습니다.

button.setOnTouchListener((v, e) -> super.onTouchEvent(e));

인터페이스를 사용자 정의하고 Lambda 표현식을 사용합니다.

먼저 하나의 추상 메서드만 사용하여 인터페이스를 정의합니다.

    interface IGetData<T> {//lambda只能用于单一方法类型匹配
        T get();//      T getOne(int i); //多个抽象方法,直接编译不过
    }

메서드를 정의하고 매개변수는 위에 정의된 인터페이스입니다.

    void print(IGetData<String> data) {        
    String msg = data.get();        
    System.out.println(msg);
    }

Lambda 표현식을 매개변수로 사용하고 호출합니다. print():

        print(() -> "张三");        print(() -> {
            System.out.println("干活了");            return "李四";
        });

출력:

03-08 06:46:00.430 1510-1510/? I/System.out: 张三
03-08 06:46:00.430 1510-1510/? I/System.out: 干活了
03-08 06:46:00.430 1510-1510/? I/System.out: 李四

람다 표현식을 사용하여 커맨더 패턴 단순화

커맨더 패턴의 특징 및 간단한 구현 과정:

  • 커맨더 인터페이스, 명령을 균일하게 실행하기 위한 추상 방법 정의

  • 각 특정 커맨더는 명령 인터페이스를 구현하고 수신 개체와 실행 에이전트에 의존합니다. 명령은 실행을 위해 수신자에게 제공됩니다

  • 호출자 클래스는 명령 인터페이스 개체에 의존하며 명령 인터페이스에 의해 실행됩니다. 다양한 특정 명령을 다형성으로 전달하고 궁극적으로 수신기는 다양한 실행 방법을 채택합니다

예(원래 구현)

예를 들어 몇 가지 파일 작업 명령:open, 닫기, 저장, 삭제 수신자는 편집자 편집자

먼저 명령 인터페이스(IAction

public interface IAction {//原 命令者  抽象出一个 执行命令的方法
    void perform();
}

)를 정의한 다음 4개의 특정 명령 클래스인 OpenAction, CloseAction, SaveAction 및 DeleteAction을 정의해야 합니다.

CloseAction 코드:

public class CloseAction implements IAction {
    private Editor mEditor;    
    public CloseAction(Editor editor) {        
    this.mEditor = editor;
    }    
    @Override
    public void perform() {        
    this.mEditor.close();
    }
}

다른 세 가지 구현은 CloseAction과 유사합니다.

편집기 클래스(수신자)는 4개의 명령을 수신하는 각 특정 구현을 정의합니다.

public class Editor {     public void save() {
          System.out.println("save");
      }      public void delete() {
          System.out.println("delete");
      }      public void open() {
          System.out.println("open");
      }      public void close() {
          System.out.println("close");
      }
}

참고: 여러 편집자가 이러한 명령에 대해 고유한 보기를 갖고 있는 경우 다른 구현에 대해 다음을 정의할 수도 있습니다. IEditor 인터페이스를 만든 다음 다른 편집기를 구현합니다. 이 점은 자세히 논의하지 않겠습니다.

마지막으로 클래스일 수 있는 호출자가 있습니다.

public class Invoker {  
    private IAction action;  

    public Invoker(IAction action) {  
        this.action = action;  
    }  

    public void invoke() {  
        this.action.perform();  
    }  
}

클라이언트는

Editor editor = new Editor();
new Invoker(new OpenAction(editor)).invoke();
new Invoker(new CloseAction(editor)).invoke();
new Invoker(new SaveAction(editor)).invoke();
new Invoker(new DeleteAction(editor)).invoke();

여기에서 명령을 시작합니다. 호출자는 클래스가 아니라 클라이언트의 메서드로 정의될 수 있습니다.

private void invoke(IAction action) {
    action.perform();
}

클라이언트가 명령 호출을 시작합니다.

 invoke(new OpenAction(editor)); 
 invoke(new CloseAction(editor)); 
 invoke(new SaveAction(editor)); 
 invoke(new DeleteAction(editor));

Lambda 표현식 단순화 버전

유지 호출 (Iaction 작업) IAction, 편집기 및 클라이언트.

클라이언트가 명령 호출을 시작합니다:

  Editor editor = new Editor();
  invoke(() -> editor.open());  
  invoke(() -> editor.close());  
  invoke(() -> editor.save());  
  invoke(() -> editor.delete());

이런 방식으로 Lambda 표현식을 사용한 후에는 특정 명령 클래스의 정의가 생략됩니다. 그리고 최종적으로 어떤 메소드가 실행되었는지 한눈에 알 수 있습니다.

이렇게 작성하면 원래의 요청과 명령 모드 실행의 분리가 파괴될 수 있으니 걱정하지 마세요.

호출(() -> editor.open()); 209861d5cd2975725c730f519ed6ad71

invoke(new IAction() {    @Override
    public void perform() {
        editor.open();
    }
});

호출 클래스 Invoker를 유지하면 다음과 같이 호출됩니다.

new Invoker(() -> editor.open()).invoke();

위 내용은 Java 8을 사용하는 Android의 새로운 기능인 Lambda 표현식의 샘플 코드에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.