SlideShare a Scribd company logo
Retrolambda
Use Lambdas in Android
kojilin@Cubie Inc.
2015/1/28
Lambda?
input.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
input.setOnClickListener(v -> {
...
});
Lambda Syntax
(int x, int y) -> x + y
(int x, int y) -> x + y
Argument List
(int x, int y) -> x + y
Arrow Token
(int x, int y) -> x + y
Body
(int x, int y) -> x + y
() -> 42
(String s) -> {
System.out.println(s);
}
● Body is expression
● Body is statement block
input.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
input.setOnClickListener(v -> {
...
});
input.setOnClickListener(v -> ...);
為何開心?
• 各種用到 anonymous class 的狀況
• Event listener
• Runnable
• RxJava
• Future / Promise Pattern API
input.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
input.setOnClickListener(v -> {
...
});
handler.post(new Runnable() {
@Override
public void run() {
...
}
});
handler.post(() -> {
...
});
Observable.from(new Integer[] {...})
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer v) {
return v < 4;
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer value) {
System.out.println("Value: " + value);
}
});
Observable.from(new Integer[] {...})
.filter(v -> v < 4)
.subscribe(value -> {
System.out.println("Value: " + value);
});
設定只要幾個步驟
下載 JDK 8
build.gradle
buildscript {
...
dependencies {
classpath 'me.tatarka:gradle-retrolambda:2.5.0'
}
}
...
apply plugin: 'me.tatarka.retrolambda'
...
設定原始碼支援
Java 8 語法
• ProGuard
• -dontwarn java.lang.invoke.**
• 而且 IDE Debug feature 也沒問題
好像很不錯,
馬上導入 !?
好像很不錯,
馬上導入 !?
等一下!!!
怎麼做到的?
Java source
(.java)
Java bytecode
(.class)
Dalvik bytecode
(.dex)
Java source
(.java)
Java bytecode
(.class)
Dalvik bytecode
(.dex)
Java 8 bytecode Java 5/6/7 bytecode
• 未來 JDK 編譯出的 bytecode 改變
• 需等 retrolambda 支援
• 不支援的話,就得持續使用舊版 JDK
• Android 新的編譯過程不經過 bytecode
• Jack & Jill
• 新增修改程式碼有時會有 NoClassDefFoundError
• 未來 Android 上的 Java 語法應該(!?)會有 Java 8,所
以程式碼切換過去也不用改變
另外...
List<Integer> list = Arrays.asList(1,2,3);
Integer sum = list.stream()
.map(i -> i * 2)
.reduce(0, (x, y) -> x + y);
List<Integer> list = Arrays.asList(1,2,3);
Integer sum = list.stream()
.map(i -> i * 2)
.reduce(0, (x, y) -> x + y);
等一下!!!
• 因為是支援 lambda 語法,所以 java 8 的 API 並
沒有支援
• 可以使用 Guava, FunctionalJava 類的專案
Integer sum = fj.data.List.list(1,2,3)
.map(i -> i * 2)
.foldLeft(i -> (j -> i + j), 0);
除了 lambda 外其他好處
• Method reference
• Effective Final
• Generalized Target-Type Inference
input.setOnClickListener(System.out::println);

More Related Content

PDF
Java8 lambda
PDF
Java 開發者的函數式程式設計
PDF
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
PPT
Hi Haskell
PPTX
Introduction to Basic Haskell Components (In Chinese)
PDF
JavaScript 快速複習 2017Q1
PPTX
Scala+RDD
PDF
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
Java8 lambda
Java 開發者的函數式程式設計
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
Hi Haskell
Introduction to Basic Haskell Components (In Chinese)
JavaScript 快速複習 2017Q1
Scala+RDD
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫

What's hot (20)

PDF
C python 原始碼解析 投影片
PDF
千呼萬喚始出來的 Java SE 7
PDF
twMVC#27 | C# 7.0 新功能介紹
PPTX
ES5 introduction
PPTX
Ecma script edition5-小试
PDF
Jscex:案例、阻碍、体会、展望
PPTX
Javascript share
PDF
Jscex:案例、经验、阻碍、展望
PDF
The Evolution of Async Programming (GZ TechParty C#)
PDF
Python速成指南
PDF
Wind.js无障碍调试与排错
PDF
Js is js(程劭非) (1)
PDF
Python learn guide
KEY
Scala
PDF
Python變數與資料運算
PPTX
Intro to C++ Basic
PDF
Sigreturn Oriented Programming
PDF
Execution
PPTX
Net Parallel Programming .NET平行處理與執行序
PDF
程式人雜誌 -- 2014 年5月號
C python 原始碼解析 投影片
千呼萬喚始出來的 Java SE 7
twMVC#27 | C# 7.0 新功能介紹
ES5 introduction
Ecma script edition5-小试
Jscex:案例、阻碍、体会、展望
Javascript share
Jscex:案例、经验、阻碍、展望
The Evolution of Async Programming (GZ TechParty C#)
Python速成指南
Wind.js无障碍调试与排错
Js is js(程劭非) (1)
Python learn guide
Scala
Python變數與資料運算
Intro to C++ Basic
Sigreturn Oriented Programming
Execution
Net Parallel Programming .NET平行處理與執行序
程式人雜誌 -- 2014 年5月號
Ad

Similar to Use Lambdas in Android (12)

PDF
竞赛中C++语言拾遗
PDF
Ooredis
PDF
Ooredis
PDF
20240921 - HITCON 社群活動 - 《HITCON CTF 甘苦談》
PDF
張逸 - 研究所 / 轉學考計算機概論 、公職計算機概要 - 程式語言 - 試閱版
PDF
functional-scala
PPTX
基于Eclipse和hadoop平台应用开发入门手册
PDF
论 Python 与设计模式。
PDF
VC++ Programming Training Lecture in Control Lab 301 of YSU
PDF
Java SE 7 技術手冊 - 課後練習解答
PPTX
xwz 2010-10-31
PPTX
Reactive X 响应式编程
竞赛中C++语言拾遗
Ooredis
Ooredis
20240921 - HITCON 社群活動 - 《HITCON CTF 甘苦談》
張逸 - 研究所 / 轉學考計算機概論 、公職計算機概要 - 程式語言 - 試閱版
functional-scala
基于Eclipse和hadoop平台应用开发入门手册
论 Python 与设计模式。
VC++ Programming Training Lecture in Control Lab 301 of YSU
Java SE 7 技術手冊 - 課後練習解答
xwz 2010-10-31
Reactive X 响应式编程
Ad

More from koji lin (17)

PDF
サーバーサイドでの非同期処理で色々やったよ
PPTX
G1GC
PDF
Using armeria to write your RPC
PDF
使用 Java 上的 future/promise API
PDF
Annotation processing and code gen
PDF
Jcconf
PDF
docker intro
PDF
Java8 time
PDF
Java8 stream
PDF
Idea13
ODP
CompletableFuture
ODP
Raspberry Pi with Java
PDF
Services you can use to monitor and analyze mobile app
PDF
Programming with Threads in Java
PDF
JQuery
PPT
山頂洞人日記 - 回歸到最純樸的開發
ODP
Android Location-based應用開發分享
サーバーサイドでの非同期処理で色々やったよ
G1GC
Using armeria to write your RPC
使用 Java 上的 future/promise API
Annotation processing and code gen
Jcconf
docker intro
Java8 time
Java8 stream
Idea13
CompletableFuture
Raspberry Pi with Java
Services you can use to monitor and analyze mobile app
Programming with Threads in Java
JQuery
山頂洞人日記 - 回歸到最純樸的開發
Android Location-based應用開發分享

Use Lambdas in Android