java8의 새로운 기능인 람다 표현식입니다. Lambda 표현식을 사용하면 인터페이스 구현을 단 하나의 함수로 대체하고 익명의 내부 클래스에 작별을 고할 수 있으며 코드가 더 간결하고 이해하기 쉬워 보입니다.
Java8에는 다른 새로운 기능도 있지만 Android에서는 사용하지 못할 수도 있습니다.
Studio 2.x 이상에서는 jack 컴파일러를 지원합니다. 이를 사용하면 java8의 Lambda 표현식을 사용할 수 있지만 다른 기능을 사용할 수 있다는 보장은 없습니다.
참고: Android SDK는 JDK의 일부 소스 코드를 통합합니다. 기본 JDK의 일부 클래스에는 새로운 기능이 추가될 수 있지만 Android의 클래스는 그렇지 않습니다. 또 다른 예는 java8의 java.util.function 패키지로, 하위 버전에서는 사용할 수 없습니다.
플러그인 Retrolambda를 사용하여 java8의 Lambda 표현식을 지원할 수도 있습니다.
다음 구성을 추가
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는 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: 李四람다 표현식을 사용하여 커맨더 패턴 단순화 커맨더 패턴의 특징 및 간단한 구현 과정:
먼저 명령 인터페이스(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!