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 시뮬레이터에서도 실행할 수 있습니다
구성 데모: //m.sbmmt.com/
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));
interface IGetData<T> {//lambda只能用于单一方法类型匹配 T get();// T getOne(int i); //多个抽象方法,直接编译不过 }
void print(IGetData<String> data) { String msg = data.get(); System.out.println(msg); }
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(); }
CloseAction 코드:
public class CloseAction implements IAction { private Editor mEditor; public CloseAction(Editor editor) { this.mEditor = editor; } @Override public void perform() { this.mEditor.close(); } }
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));
Editor editor = new Editor(); invoke(() -> editor.open()); invoke(() -> editor.close()); invoke(() -> editor.save()); invoke(() -> editor.delete());
호출(() -> editor.open()); <==>
invoke(new IAction() { @Override public void perform() { editor.open(); } });
new Invoker(() -> editor.open()).invoke();
위 내용은 Java 8을 사용하는 Android의 새로운 기능인 Lambda 표현식의 샘플 코드에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!