Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
Search
RyotaMurohoshi
October 28, 2014
Technology
0
15
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
2014/10/28にpixivさんで行われたRxJavaNightの@RyotaMurohoshiの資料です。
※元々はSlideShareで公開していた資料です
RyotaMurohoshi
October 28, 2014
Tweet
Share
More Decks by RyotaMurohoshi
See All by RyotaMurohoshi
Unityの合同同人誌や合同商業誌を書いてる僕は感想やレビューや評価が欲しい
ryotamurohoshi
0
530
Unity 2021.1での Unityパッケージの名称変更について
ryotamurohoshi
0
710
Odin Validationはいいぞ!
ryotamurohoshi
2
960
Tilemapはいいぞ!2020 〜すごいぞ、プロジェクト専用拡張Brush〜
ryotamurohoshi
0
2.4k
Unityでも、新しいC#
ryotamurohoshi
0
1.3k
Riderはいいぞ!
ryotamurohoshi
1
3.5k
Riderのススメ〜俺はRiderここが好き〜
ryotamurohoshi
1
2.4k
Unity開発者に伝えたい.NETのこと
ryotamurohoshi
4
37k
ImportedLinqのススメ
ryotamurohoshi
0
1.4k
Other Decks in Technology
See All in Technology
A2Aのクライアントを自作する
rynsuke
1
220
強化されたAmazon Location Serviceによる新機能と開発者体験
dayjournal
3
230
How Community Opened Global Doors
hiroramos4
PRO
1
130
Geminiとv0による高速プロトタイピング
shinya337
0
150
標準技術と独自システムで作る「つらくない」SaaS アカウント管理 / Effortless SaaS Account Management with Standard Technologies & Custom Systems
yuyatakeyama
3
1.3k
TechLION vol.41~MySQLユーザ会のほうから来ました / techlion41_mysql
sakaik
0
190
Microsoft Build 2025 技術/製品動向 for Microsoft Startup Tech Community
torumakabe
2
310
Amazon S3標準/ S3 Tables/S3 Express One Zoneを使ったログ分析
shigeruoda
5
580
論文紹介:LLMDet (CVPR2025 Highlight)
tattaka
0
130
Understanding_Thread_Tuning_for_Inference_Servers_of_Deep_Models.pdf
lycorptech_jp
PRO
0
140
GitHub Copilot の概要
tomokusaba
1
140
CursorによるPMO業務の代替 / Automating PMO Tasks with Cursor
motoyoshi_kakaku
1
520
Featured
See All Featured
A Tale of Four Properties
chriscoyier
160
23k
Building Applications with DynamoDB
mza
95
6.5k
The Cult of Friendly URLs
andyhume
79
6.5k
GraphQLとの向き合い方2022年版
quramy
49
14k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.8k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
710
A Modern Web Designer's Workflow
chriscoyier
694
190k
Fireside Chat
paigeccino
37
3.5k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.7k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.5k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Transcript
@RyotaMurohoshi 2014/10/28'RxJava'Night
೦ͳ͕Βɺॳ৺ऀͰ͢ ͝ΊΜͳ͍͞
ಥવͰ͕࣭͢Ͱ͢ʂ
RxJavaͳͲΛ͏͢Ͱʹ ΨοπϦ͍ͬͯΔํʁ
RxJavaɺHello*world ͨ͠Αͬͯํʁ
RxJavaΑ͘Θ͔Βͳ͍͚Ͳ ڵຯ͋ΔΑͬͯํʁ
ϓϩάϥϛϯάݴޠGroovy ͍ͬͯΔ!or!͍ͬͯΔํʁ
C#erͳํɺC#͔Δํʁ
Unity͍ͬͯΔํʁ
͋Γ͕ͱ͏͍͟͝·ͨ͠
͓લͩΕΑ • ໊લ":"྄ࣨଠ • ࣄ":"UnityήʔϜ։ൃ(C#)ɺʲલʳAndroidΞϓϦ։ൃ(Java) • Twi6er":"@RyotaMurohoshi • ߘઌ":"h6p:/ /qiita.com/RyotaMurohoshi
• ڵຯ":"UnityɺC#ɺGroovy
ʲॳ৺ऀ͕ͬͯΈͨʳ RxɺνϟϨϯδͯ͠Έͨ ͱ͍͏ςʔϚͰɺ಄ͷ࣭ʹؔͷ͋Δ༰Ͱ͓ૹΓ͠·͢ɻ
ձ͕ʮRx͍͢͝ਓͨͪʯ͔ΓͩͬͨΒ ΨνযΓ͍ͯ͠·͢ ੜஆ͔͍Ͱݟ͍ͯ͋͛ͯͩ͘͞
Έͳ͞ΜRxJavaΛΓ·ͨ͠ɻ ͬͯΈ͍ͨͰ͢Ͷɻ ·ͣɺͲ͜Λݟ·͔͢ʁ
RxJavaͷwiki h"ps:/ /github.com/Reac3veX/RxJava/wiki
RxJavaͷWiki)filterϝιουͷઆ໌ΑΓ h0ps:/ /github.com/Reac<veX/RxJava/wiki/FilteringAObservables) numbers = Observable.from([1, 2, 3, 4, 5,
6, 7, 8, 9]); numbers.filter({ 0 == (it % 2) }).subscribe( { println(it); }, // onNext { println("Error: " + it.getMessage()); }, // onError { println("Sequence complete"); } // onCompleted );
Μʁ
ͳΜͩ͜Εʁ • [1,%2,%3,%4,%5,%6,%7,%8,%9] • {%0%==%(it%%%2)%} • it • println%("Sequence%Complete")
Groovy
ʲΑ͍ͱ͓ͬͨɺίϨศརʂʳ RxJava͏ͳΒɺGroovy͋Γʂ
RxJavaͷwikiͷαϯϓϧίʔυɺ ݁ߏGroovyͰॻ͔Ε͍ͯΔ
Groovy • JVMݴޠ • Javaͱͷੑ͕ߴ͍ • ؆ܿͳهड़ॊೈͳॲཧ͕Ͱ͖Δ • Groovy2.4͔ΒAndroidʹରԠ(ࠓbeta63)
RxJavaɺΠϯλʔϑΣʔεΛҾʹͱΔϝιου͔ΓͰ͢Ͷ .map(new Func1<OnClickEvent, Integer>() { @Override public Integer call(OnClickEvent clickEvent)
{ return 1; } }) ແବʹ͍ɽɽɽ
ແବʹ͍ͷݏͩʂ • Java8ͳΒϥϜμࣜ • Java8ΑΓલͰretrolambda
ແବʹ͍ͷݏͩʂ • Java8ͳΒϥϜμࣜ • Java8ΑΓલͰretrolambda • Groovy͋Γʂ
Androidͩͱɺ
RxAndroidͱRxJavaɺBu.onΫϦοΫճΛTextViewʹදࣔ ViewObservable.clicks(findViewById(R.id.button)) .map(new Func1<OnClickEvent, Integer>() { @Override public Integer call(OnClickEvent
clickEvent) { return 1; } }) .scan(new Func2<Integer, Integer, Integer>() { @Override public Integer call(Integer acc, Integer current) { return acc + current; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer clickCount) { TextView textView = (TextView)findViewById(R.id.text_view); textView.setText(clickCount.toString()); } });
͍ʂ
RxAndroidͱRxJavaͱGroovyɺBu0onΫϦοΫճΛTextViewʹදࣔ ViewObservable.clicks(findViewById(R.id.button)) .map { 1 } .scan { acc, current
-> acc + current } .subscribe { findViewById(R.id.text_view).setText(it.toString()) }
͖ͬ͢Γʂ
GroovyͷΫϩʔδϟͰɺͱ͖ͬͯͬ͢Γʂ RxAndroid+Groovyͷྫ-h/p:/ /qiita.com/RyotaMurohoshi/items/48bbbecea49591fd20a2 Ϋϩʔδϟͷॻ͖ํ͍Ζ͍Ζ!h#p:/ /qiita.com/RyotaMurohoshi/items/2a30a74c0074e11d0207
RxGroovy • RxJavaͷΠϯλʔϑΣʔεΛҾʹͱΔϝιουͰɺGroovyͷ ΫϩʔδϟΛͤΔΑ͏ʹ͢Δͷ • Groovy2.2Ҏ্ͳΒΫϩʔδϟͷ҉తͳڧ੍ܕมʹΑΓɺ RxGroovyͳ͠ͰΫϩʔδϟΛͤΔ • AndroidͰGroovy2.4Ҏ্͏ͳΒɺRxGroovyແͯ͘OK h"p:/
/qiita.com/RyotaMurohoshi/items/3f1f3cde0e5c6785b2f1
GroovyͰɺRxJava͜Μͳ͍هड़Ͱ࢝ΊΒΕΔ @Grab(group='com.netflix.rxjava', module='rxjava-core', version='0.20.4') import rx.Observable import rx.functions.Action1 Observable.from("Taro", "Jiro",
"Saburo").subscribe { println "Hello $it"}
RxJavaʹݶΒͣɺJavaͷϥΠϒϥϦΛνϣϩͬͱࢼ࣌͢ Groovyศརͩͱࢥ͍·͢ʂ • Ϋϥεͱ͔mainϝιουͳ͠Ͱ͍͖ͳΓॻ͚Δ(εΫϦϓτ) • GrapeʹΑΓɺΞϊςʔγϣϯҰൃͰϥΠϒϥϦ͑Δ • GroovyShellͰରతʹࢼͤΔ h"p:/ /qiita.com/RyotaMurohoshi/items/99475255e56f8fae712b
ʲΑ͍ͱ͓ͬͨɺίϨศརʂʳ RxJava͏ͳΒɺGroovy͋Γʂ Ͱͨ͠ʂ
ͯ͞ɺRxJava͍͜ͳͤΔΑ͏ʹͳΓ͍ͨͰ͢ΑͶʁ Ͳ͏͠·͠ΐ͏ʁ
RxJava&is&a&Java&VM&implementa1on& of&Reac1ve&Extensions:&a&library&for& composing&asynchronous&and&event> based&programs&by&using&observable& sequences. —"RxJavaͷwiki"HomeΑΓ(h1ps://github.com/Reac<veX/RxJava/wiki)
Reac%ve'Extensions
RxJavaReac(ve)Extensions(C#ͷϥΠϒϥϦ)Λجʹ͍ͯ͠Δ RxJavaΛ͍͜ͳ͍ͨ͠ͳΒ Reac%ve'ExtensionsͷهࣄɾߘͳͲͷใཱͭʂ
ʲ͜ͷใ͕ૉఢʂͱ͔ͬͯΓ͍͢ʂʳ Reac%ve'ExtensionsͷࢿྉͰRxͷษڧΛ͠ɺ RxJavaΛ͍͜ͳ͢
ͪΖΜJavaͱC#ͷҧ͍͋Γ·͢ ϝιου໊͕ҧ͏ͭ͋Γ·͢(WhereͱfilterɺSelectͱmap)
ͦΕͰRxͷߟ͑ํΛ ཧղ͢Δͷʹɺ ͱ͍͍ͬͯͱࢥ͍·͢ʂ
ϓϩάϥϛϯάC#ୈ7൛ 11ষؙʑRx(Reac(ve*Extensions) ͝ΊΜͳ͍͞ɺ࠷ॳʹ͜ΕಡΉͷͪΐͬͱͭΒ͔ͬͨͰ͢
Reac%ve'Extensions(C#ͷϥΠϒϥϦ)ͷ ૉఢͳϒϩάɾهࣄΛߘ͞Ε͍ͯΔํୡ͕͍·͢ ͦͷํୡͷϒϩάͱ͔ͯΓ͔ͬͨ͢Ͱ͢
xin9le͞Μ Rxೖ h"p:/ /xin9le.net/rx/intro
xin9le͞ΜͷRxೖ RxͷೖɻϓϩάϥϛϯάC#%ୈ7൛ΛಡΉલʹɺͪ͜ΒΛઌʹಡΈ͔ͨͬͨɻ ॳΊʹͪ͜ΒΛಡΉͷ͕ͱ͍͍ͯͱࢥ͍·͢ʂ ଞʹεϥΠυͨ͘͞Μެ։͞Ε͍ͯ·͢ʂ
okazuki͞Μ Reac%ve'Extensions'࠶ೖ h"p:/ /okazuki.hatenablog.com/archive/category/Reac9ve%20Extensions
okazuki͞ΜͷReac*ve,Extensions࠶ೖ Reac%ve'ExtensionsͷϝιουΛ࣮ࡍʹಈ͔ͨ͠αϯϓϧίʔυ͕ͨ͘͞Μ ϦϑΝϨϯεͷઆ໌จΛݟͯϝιουͷΠϝʔδ͕༙͖·ͤΜͰ͕ͨ͠ɺ ࣮ࡍͷίʔυͱ࣮ߦ݁ՌͰΠϝʔδ͕༙͖·ͨ͠ʂ
neuecc͞Μ ࿈ࡌɿReac%ve'ExtensionsʢRxʣೖ h"p:/ /www.atmarkit.co.jp/fdotnet/introrx/index/ UniRxʹ͍ͭͯ h"p:/ /neue.cc/2014/08/23_476.html7ͳͲ
neuecc͞Μ ͔ͳΓૣ͍ஈ֊͔ΒReac%ve'Extensionsʹ͞Ε͍ͯͯ·͢ ϒϩάɺεϥΠυ͚ͩͰͳ͘@IT͞ΜͰ࿈ࡌ͞Ε͍ͯ·͢ UnityͰ͑ΔReac*ve,ExtensionsҠ২ͷUniRxͷ࡞ऀ͞ΜͰ͢ ࠓొஃ͞Ε͍ͯ·͢
ʲ͜ͷใ͕ૉఢʂͱ͔ͬͯΓ͍͢ʂʳ Reac%ve'ExtensionsͷࢿྉͰRxͷษڧΛ͠ɺ RxJavaΛ͍͜ͳ͢ Ͱͨ͠ʂ
γϯϓϧͳྫͰ͕͢ɺ ·ͣखΛಈ͔ͯ͠Έ·ͨ͠ʂ ࠓޙͬͯΈͯɺߘ͍ͯ͜͠͏ͱࢥ͍·͢ ؒҧ͍ͬͯͨΒɺ༏͘͠·͔͞Γ͍͚͛ͯͨͩΔͱ͏Ε͍͠Ͱ͢ RxAndroid+Groovy-:ɹh0p:/ /qiita.com/RyotaMurohoshi/items/48bbbecea49591fd20a2 UnityͰUniRxΛͬͯ(:(h+p:/ /qiita.com/RyotaMurohoshi/items/7e1509e03d8e3a1eae4f
ল ཧతͳجૅͷษڧΛޙճ͠ʹ͗ͯ͢͠͠·ͬͨɻ
FRPRxʹ͍ͭͯ ·ͬͨ͘;Εͣਃ͠༁ͳ͍Ͱ͢ʂ
ʲॳ৺ऀ͚ͩΕͲʳ RxɺGroovyͰࢼ͢ͷ͋Γͩͱࢥ͏͠ɺ Reac%ve'Extensinsͷࢿྉ ͱͬͯࢀߟʹͳΔͱࢥ͏ɻ Ͱͨ͠ɻ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ @RyotaMurohoshi h"p:/ /qiita.com/RyotaMurohoshi