SlideShare a Scribd company logo
Lightweight-Stream-API
のあるAndroidアプリ開発
第1回スタートアップAndroid勉強会
About Me
Shinobu Okano
@operandoOS
Mercari, Inc.
Souzoh, Inc.
Lightweight-Stream-APIのあるAndroidアプリ開発
Lightweight-Stream-API?
"Stream API from Java 8 rewritten
on iterators for Java 7 and below."
https://github.com/aNNiMON/Lightweight-Stream-API
Lightweight-Stream-API?
Androidでも使える!!
Lightweight-Stream-API?
ヤター🍷
Lightweight-Stream-API Includes
• Functional interfaces
• Stream/IntStream
• Optional class
• Exceptional class
• Objects from Java 7
Streamだけじゃないんやでー!!
Lightweight-Stream-API Includes
ちなみに...
• Lightweight-Stream-APIって名前が長い...
• LSAって訳すっぽい
• READMEにLSAって記述があった
• 資料ないでLSAと書いてあるのは

Lightweight-Stream-APIという意味です
Stream
Stream?
Java 8で導入されたAPI
Stream?
"A sequence of elements
supporting sequential and
parallel aggregate operations."
Stream(正しくはないけど雑に...)
繰り返し処理のforやwhileをStreamにして
パイプライン的に処理する
Lightweight-Stream-API
• "without parallel processing but with a variety
of additional methods and with custom
operators"
• parallelは提供されていない
Lightweight-Stream-API ≠ Java 8 Stream
• イコールではない
• Java 8 Stream APIのようなインターフェイス
もったもの
Streamの流れ
• Streamの生成
• 中間操作 (map,filter,etc.)
• あるストリームを別のストリームに変換する操作
• 終端操作 (forEach,count,collect,etc.)
• 結果または副作用を生成する操作
Java 8 Stream
• スコアのListから30点以上のものを表示する
• Java 8のCollectionにStreamに変換するメソッドがある
List<Integer> scores = Arrays.asList(100, 30, 35, 20);
scores.stream() // Streamの生成
.filter(score -> score >= 30) // 中間操作
.forEach(System.out::println); // 終端操作
for
• スコアのListから30点以上のものを表示する
for (Integer score : scores) {
if (score >= 30) {
System.out.println(score);
}
}
Java 8 Parallel Stream
• parallelStream()で並列処理
• 並列で処理するので結果の順番は変わる可能性がある
List<Integer> scores = Arrays.asList(100, 30, 35, 20);
scores.parallelStream()
.filter(score -> score >= 30)
.forEach(System.out::println);
Lightweight-Stream-API
• スコアのListから30点以上のものを表示する
• Stream.ofでStreamを作る
List<Integer> scores = Arrays.asList(100, 30, 35, 20);
Stream.of(scores) // Streamの生成
.filter(score -> score >= 30) // 中間操作
.forEach(System.out::println); // 終端操作
出力じゃなくてListにしたい!(Lightweight-Stream-API)
• 終端操作をcollectにするだけなので簡単!
List<Integer> scores = Arrays.asList(100, 30, 35, 20);
List<Integer> filteredScores = Stream.of(scores)
.filter(score -> score >= 30)
.collect(Collectors.toCollection(ArrayList::new));
中間操作、終端操作のメソッドは色々ある!
• 全部説明できないので、javadocとかみて試してね!
• 大体ほしいと思う機能は ってるはず
• Stream - Lightweight-Stream-API javadoc
• http://static.javadoc.io/com.annimon/stream/
1.1.3/com/annimon/stream/Stream.html
Lightweight-Stream-API
• AndroidでJava 8のStreamっぽいものが使える!
• 中間操作と終端操作は同じで書ける
• 流れるように処理を書けるので気持ちいい!
• Java力 UP 💪
• Java 9でStreamに追加されるfunctionも使える!
• good-bye for??
Optional
Optional?
"A container object which may or
may not contain a non-null value."
Optional?(雑)
値をラップしてnullかもしれない
ことを表現するクラス
good-bye NullPointerException?
NO 😂
Optional - Java 8
Optional<String> optional = Optionalを返すメソッド();
// nullでなければ表示される
optional.ifPresent(System.out::println);
Optional - Lightweight-Stream-API
Optional<String> optional = Optionalを返すメソッド();
// nullでなければ表示される
optional.ifPresent(System.out::println);
同じや☺
Optional + Android
• Android SDKのAPIって思った以上にnullを返すものが多い
• ドキュメント読んで「え?null返るの?」と知るものも度々
• FragmentねーgetContextとかgetActivityとか…
• コードレビューでつっつかれたくない…
• Fragment#getResourcesもmHostがnullだと
IllegalStateException
Fragment#getContext()
"Return the Context this fragment is
currently associated with."
https://developer.android.com/reference/android/support/v4/app/Fragment.html#getContext()
Fragment#getContext()
• null返るやん👀
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}
Fragment + Optional
public static Optional<Context> getOptionalContext(Fragment fragment) {
if (fragment.isDetached()) {
return Optional.empty();
}
return Optional.ofNullable(fragment.getContext());
}
// 安全!
FragmentUtil.getOptionalContext(this)
.ifPresent(context -> {
Toast.makeText(context, "Optional", Toast.LENGTH_SHORT).show();
});
Fragment + Optional
public static Optional<FragmentActivity>
getOptionalFragmentActivity(Fragment fragment) {
if (fragment.isDetached()) {
return Optional.empty();
}
return Optional.ofNullable(fragment.getActivity());
}
// menuの更新
// 安全!
FragmentUtil.getOptionalFragmentActivity(this)
.ifPresent(FragmentActivity::supportInvalidateOptionsMenu);
Fragment + Optional
public static Optional<Bundle> getArguments(Fragment fragment) {
return Optional.ofNullable(fragment.getArguments());
}
// 安全!
FragmentUtil.getArguments(this)
.ifPresent(bundle -> {
// bundleから値を取り出す
});
複数のOptionalを扱う
• Optional AとOptional Bの両方がnullでなければ...みたいなパターン
• そもそもこれで正しいのかわからない...
Optional<FragmentActivity> optionalFragmentActivity =
FragmentUtil.getOptionalFragmentActivity(this);
Optional<String> titleOptional = titleOptional();
optionalFragmentActivity.ifPresent(fragmentActivity -> {
titleOptional.ifPresent(title -> {
fragmentActivity.setTitle(title);
});
});
複数のOptionalを扱う
• 2つのOptionalに値が入っていれば

TupleをOptionalでラップして返す
• これならどうだ💪
複数のOptionalを扱う
public static <T, R> Optional<Pair<T, R>> flatMapPair(Optional<T> a, Optional<R> b) {
if (a.isPresent() && b.isPresent()) {
// 2つのOptionalに値が入っていればTupleをOptionalでラップして返す
return Optional.ofNullable(Pair.create(a.get(), b.get()));
} else {
// そうでないならempty
return Optional.empty();
}
}
OptionalUtil.flatMapPair(optionalFragmentActivity,titleOptional)
.ifPresent(pair -> {
pair.getFirst()setTitle(pair.getSecond());
});
複数のOptionalを扱う💪💪💪
public static <F, R, T> Optional<Triplet<F, R, T>>
flatMapTriplet(Optional<F> a,
Optional<R> b,
Optional<T> c) {
if (a.isPresent() && b.isPresent() && c.isPresent()) {
return Optional.ofNullable(
Triplet.create(a.get(), b.get(), c.get()));
} else {
return Optional.empty();
}
}
💪
でも
JavaにTupleないやん...
Guild
• 💪
• Simple java tuples.
• https://github.com/operando/Guild
LSAのOptionalにしかない便利なメソッド
• Optional.stream()
• OptionalからStreamに変換できる
• 他にもいくつかある…
Optional.ofNullable(integers)
.stream()
.forEach(System.out::println);
Java 8で同じことをすると
• 一手間必要
Optional.ofNullable(integers)
.map(integers1 -> integers1.stream())
.orElse(Stream.empty())
.forEach(System.out::println);
Optionalにも中間操作、終端操作的なのがある
• 中間操作?的なの
• map,flagMap,filter,etc…
• 終端操作?的なの
• ifPresent,orElse,etc…
• Optional javadoc - Lightweight-Stream-API
• http://static.javadoc.io/com.annimon/stream/1.1.3/com/
annimon/stream/Optional.html
Optional
• AndroidでJava 8のOptionalと同じようなものが使える
• Java力 UP💪
• ifでnullチェックするより自然な感じでプログラムが書ける
• nullがなくなるわけではない
• 扱いが難しいこともある
• Optionalのラップしてる値がnullだった時の処理を忘れるとか...
Objects
Objectsもいいぞ!
• Java 7から追加されたAPI
• AndroidではminSdkVersion 19以上じゃない
とJava 7のAPIは使えないはず
Objectsもいいぞ!
• 2つの文字列を比較したい
String s1 = String返すメソッド();
String s2 = String返すメソッド();
// s1はnullかもしれない...
s1.equals(s2);
// Objects - Lightweight-Stream-API
// どちらかがnullでも安全!
Objects.equals(s1,s2);
Andorid N minSdkVersion 24
• Java 8のAPIがいくつか入ってる
• StreamとOptionalは入ってる
• 他にもいくつか…
• Lightweight-Stream-API使わなくてもよい
• minSdkVersion 24...何年先?
Android-Java-8-Stream-Example
• Lightweight-Stream-APIの作者がAndroidで
Java 8っぽく書くサンプルを書いてる
• https://github.com/aNNiMON/Android-
Java-8-Stream-Example
まとめ
• Lightweight-Stream-APIを使えば

AndroidでもStreamっぽいものとOptionalが使える
• Java力 UP💪につながる
• Android開発のJavaだとJava 6,7で技術が止まってしまう可能性も…
• 僕と一緒に開発する人にはJavaの力もつけてほしい💪
• Java 9も来年出るのでJava自体に関心を!
Links
• Lightweight-Stream-API version 1.1.3 javadoc
• http://static.javadoc.io/com.annimon/stream/1.1.3/overview-summary.html
• Stream - Java 8
• https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
• Java 8 Stream Tutorial
• http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/
• Optional - Java 8
• https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
• Optionalの取り扱いかた
• http://irof.hateblo.jp/entry/2015/05/05/071450
Thanks

More Related Content

PDF
PHPカンファレンス2014の懇親会飛び込みLT資料
PDF
Javaで1から10まで書いた話(sanitized)
PDF
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
PDF
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
PDF
LaravelでAPI定義を管理する
PDF
Behatで行う、E2Eテスト入門
PDF
WildFly Swarmではじめる「パーツとしてのJavaEE」
PDF
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
PHPカンファレンス2014の懇親会飛び込みLT資料
Javaで1から10まで書いた話(sanitized)
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
LaravelでAPI定義を管理する
Behatで行う、E2Eテスト入門
WildFly Swarmではじめる「パーツとしてのJavaEE」
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...

What's hot (14)

PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
PDF
いまどきのPHP開発現場 -2015年秋-
PDF
Isomorphic web development with scala and scala.js
PPTX
Behat Driven Development
PDF
動的なILの生成と編集
PDF
Java Batch 仕様 (Public Review時点)
PDF
Laravelとテストについて
PDF
中・大規模でLaravelを導入するTips
PDF
H2O and php
PDF
Javaアプリケーションサーバ 構築・運用の勘所
PDF
Laravelでfacadeを使わない開発
PDF
Java SE 9の紹介: モジュール・システムを中心に
PDF
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
PDF
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
SPAセキュリティ入門~PHP Conference Japan 2021
いまどきのPHP開発現場 -2015年秋-
Isomorphic web development with scala and scala.js
Behat Driven Development
動的なILの生成と編集
Java Batch 仕様 (Public Review時点)
Laravelとテストについて
中・大規模でLaravelを導入するTips
H2O and php
Javaアプリケーションサーバ 構築・運用の勘所
Laravelでfacadeを使わない開発
Java SE 9の紹介: モジュール・システムを中心に
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
Ad

More from Shinobu Okano (20)

PDF
OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!
PDF
Kotlinでマッチョする話
PDF
Android Framework Code Readingのしおり ver 1.2
PDF
まったりAndroid Framework Code Reading #4
PDF
shinobu.apk #3
PDF
Android + JSON-RPC
PDF
Inside Android N
PDF
Gradle PluginとCIと俺
PDF
shinobu.apk #2
PDF
まったりAndroid Framework Code Reading #3
PDF
Android Framework Code Readingのしおり ver 1.1
PDF
Kotlinにお触り
PDF
DroidKaigiアプリをSpoonで全画面スクショするぞい\(^o^)/
PDF
Gradle PluginとTwitterとズン ドコ キ・ヨ・シ!
PDF
ChromeとAndroidの過去・現在・未来
PDF
Android Dev Tools Knowledge
PDF
shinobu.apk #1
PDF
ChromeとAndroidの 過去・現在・未来 ver 0.1
PDF
5分で資料作ってSlideShareにアップロードする錬金術
PDF
Logcatの話
OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!
Kotlinでマッチョする話
Android Framework Code Readingのしおり ver 1.2
まったりAndroid Framework Code Reading #4
shinobu.apk #3
Android + JSON-RPC
Inside Android N
Gradle PluginとCIと俺
shinobu.apk #2
まったりAndroid Framework Code Reading #3
Android Framework Code Readingのしおり ver 1.1
Kotlinにお触り
DroidKaigiアプリをSpoonで全画面スクショするぞい\(^o^)/
Gradle PluginとTwitterとズン ドコ キ・ヨ・シ!
ChromeとAndroidの過去・現在・未来
Android Dev Tools Knowledge
shinobu.apk #1
ChromeとAndroidの 過去・現在・未来 ver 0.1
5分で資料作ってSlideShareにアップロードする錬金術
Logcatの話
Ad

Lightweight-Stream-APIのあるAndroidアプリ開発