Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Java8を1年使ってみて思ったこと
Search
ftsan
October 11, 2016
170
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Java8を1年使ってみて思ったこと
ftsan
October 11, 2016
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Paper Plane (Part 1)
katiecoart
PRO
2
12k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Design in an AI World
tapps
1
350
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
270
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
How Software Deployment tools have changed in the past 20 years
geshan
2
35k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
570
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Writing Fast Ruby
sferik
630
63k
Transcript
+BWBΛͬͯΈͯࢥͬͨ͜ ͱ ftsan
ࣗݾհ ftsan झຯɿےτϨɺϚϯΨ ಛٕɿͷԼ͔Β͓ͳΒΛ͢Δ͜ͱ͕Ͱ͖Δɻ ಛٕ̎ɿ͓͠Γ͔Β͓ͳΒΛ͢Δ͜ͱ͕Ͱ͖Δɻ
Java8Λ1ͬͯؾ͍ͮͨ͜ͱ
1લͷ͓ΕશવJava8ͷػೳʢStream, OptionalʣཧղͰ͖ͯͳ͍͡ΌΜʂ
ͱ͍͏͜ͱͰɺ1ؒͬͨதͰؾ ͍ͮͨJava8Ͱॻ͘Stream API, Optional ͷΛ͍ͤͯͩ͘͞͞
java.util.ObjectsΛ͏
Bad case Stream.of("a", "b", null, “d”) .filter(s -> s ==
null).collect(toList()); Stream.of("a", "b", null, “d”) .filter(s -> s != null).collect(toList()); Stream.of(1, 2, null, 4) .map(i -> i.toString()).collect(toList());
Bad case Stream.of("a", "b", null, “d”) .filter(s -> s ==
null).collect(toList()); Stream.of("a", "b", null, “d”) .filter(s -> s != null).collect(toList()); Stream.of(1, 2, null, 4) .map(i -> i.toString()).collect(toList()); OK! Stream.of("a", "b", null,”d”) .filter(Objects::isNull).collect(toList()); Stream.of("a", "b", null,”d") .filter(Objects::nonNull).collect(toList()); Stream.of(1, 2, null, 4) .map(Objects::toString).collect(toList());
flatMapʹ׳ΕΔ
Bad case // カレントディレクトリとその子ディレクトリのファイルのリストを作成 List<File> files = Stream.of(new File(".").listFiles()).map(file ->
{ File[] subDir = file.listFiles(); if (subDir == null) { return Arrays.asList(file); } return Arrays.asList(subDir); }).reduce(new ArrayList<File>(), (list1, list2) -> { list1.addAll(list2); return list1; });
Bad case // カレントディレクトリとその子ディレクトリのファイルのリストを作成 List<File> files = Stream.of(new File(".").listFiles()).map(file ->
{ File[] subDir = file.listFiles(); if (subDir == null) { return Arrays.asList(file); } return Arrays.asList(subDir); }).reduce(new ArrayList<File>(), (list1, list2) -> { list1.addAll(list2); return list1; }); Good! List<File> files = Stream.of(new File(“.").listFiles()).flatMap(file -> { File[] subDir = file.listFiles(); if (subDir == null) { return Arrays.asList(file).stream(); } return Arrays.asList(subDir).stream(); }).collect(toList());
ؔܕΠϯλʔϑΣʔεΛ֮͑Δ
ݸਓతʹCollectorsͷϝιου໊ Θ͔Γ͍͢ͱࢥ͍ͬͯΔ
͔͠͠ҾΛͲͷॱ൪ͰԿΛ͢ ͔Θ͔ΓͮΒ͍
Function<?, super T, ? extends K> classifier, Supplier<M> mapFactory, …..
ਖ਼ͳΜͳͷ͔Θ͔ΒΜ
ਖ਼ͳΜͳͷ͔Θ͔ΒΜ
ؔܕΠϯλʔϑΣʔεΛ֮͑ͯ ͍Εා͘ͳ͍ →ϝιουɾม໊ͱؔͷҙຯ ͔ΒͦΕͧΕͷҾ͕ԿΛ͢Δ ͷ͔͕͔ͳΓਖ਼֬ʹਪଌͰ͖Δ
දతͳؔܕΠϯλʔϑΣʔε Consumer<T> T型の入力値1つ、戻り値なしのインターフェース forEach()の引数等 副作用を伴う使い方が多い Supplier<T> 入力値なし、戻り値はT型のインターフェース OptionalのorElseGet()等 ファクトリーとして使うケースが多い Predicate<T>
T型の入力値1つ、戻り値はbooleanのインターフェース Streamのfilter()等 条件に該当するかを確認するために使う Function<T, R> T型の入力値1つ、戻り値はR型のインターフェース Streamのmap()等 引数を取って何らかの処理をして値を返す ଞʹछྨ͋Δ͕ɺ΄ͱΜͲ্هͷͲΕ͔ͷੜܥͩͱߟ͍͑ͯΔɻ ʢBiʙͩͱҾ͕̎ͭͷόʔδϣϯɺΈ͍ͨͳײ͡ʣ
classier: ༁͢ΔͱྨثɺFunctionܕͰ͋Δ͜ͱ͔ΒKeyΛੜ͢ΔͨΊͷؔ ͱਪଌ , mapFactory: ม໊ɾܕ͔ΒMapͷFactoryͰ͋Δͱਪଌ , downStream: ྨํ๏(݁ՌͷKeyͱͳΔ)ͱ݁ՌͷFactory͕طʹఆٛ͞Ε͓ͯ Γɺܕ͕ऴॲཧͷؔͰ͋Δ͜ͱ͔Βɺ݁ՌͷValueͷूํ๏ͱ༧ଌͰ͖Δ
OptionalΛ্खʹ͏
OptionalΛ͏త →Λϥοϓ͠ɺͦͷ͕null͔ ͠Εͳ͍͜ͱΛදݱ͢Δ
OKɺతΘ͔ͬͨɻ ͱ͍͏͔Կฉ͔͞Ε͍ͯΔͷ Ͱ͍͍Ճݮ֮͑ͨɻ
ͨͩɺతΛ͍ͬͯΔ͔Βͱݴͬ ͯɺ࣮ࡍʹίʔυʹམͱ͠ࠐΉͷ ݁ߏ͍͠ɻ
͜ͳ͍ͩݟͨɺΘΓͱ͋Γ͕ͪͳίʔυ public enum Color { RED, BLUE,GREEN; public static Color
fromName(String name) { return Stream.of(Color.values()) .filter(c -> c.name().equals(name)) .findFirst() .orElse(null); } }
͜ͳ͍ͩݟͨɺΘΓͱ͋Γ͕ͪͳίʔυ public enum Color { RED, BLUE,GREEN; public static Color
fromName(String name) { return Stream.of(Color.values()) .filter(c -> c.name().equals(name)) .findFirst() .orElse(null); } } ࠷ޙͷҰจʹҧײΛײ͡Δ →public static ͳϝιουͰೖྗ νΣοΫ͠ͳ͍ͷʹɺorElse ͰnullΛฦͯ͠Δ →ϝιουΛݺͿଆ͕ෆਖ਼ͳ Λͤnull͕ฦΔ
͋Δ͖ίʔυ public enum Color { RED, BLUE,GREEN; public static Optional<Color>
fromName(String name) { return Stream.of(Color.values()) .filter(c -> c.name().equals(name)) .findFirst(); } } ͪΌΜͱnull͕ฦΔՄೳੑ͕͋ Δ͜ͱΛݺͼग़͠ݩʹ͑Δ ͖ɻ
Optionalͷmap()ɺflatMap()͕͔ͳΓศར // 引数のどちらかがemptyでもぬるぽが発生しない public static Optional<Integer> sum(Optional<Integer> a, Optional<Integer> b)
{ return a.flatMap(n1 -> b.map(n2 -> n1 + n2)); }
Optionalͷmap()ɺflatMap()͕͔ͳΓศར // 引数のどちらかがemptyでもぬるぽが発生しない public static Optional<Integer> sum(Optional<Integer> a, Optional<Integer> b)
{ return a.flatMap(n1 -> b.map(n2 -> n1 + n2)); } Optionalཁૉ͕0͔1ͷ Streamͱಉ͡ͱߟ͑Δ ʢfilter()͋Δʣ
Optional͕ແ͍Մೳੑ͕͋Δ ͷΛදݱ͢ΔͨΊͷAPI͕ͩɺ Streamͱ͍ۙΑ͏ͳͷͰ͋Δ ͱ͍͏ೝࣝΛ͍࣋ͬͯΔͱѻ͍ ͘͢ͳΔ
CollectorsΛ͍͢
Collectors: Stream APIͷऴૢ࡞Ͱ ൚༻తͳͷΛ·ͱΊͨΫϥε • toList(), toSet(), toMap(), minBy(), maxBy(),
etc…
ଞʹศརͳͷ͕ͨ͘͞Μ͋Δ ͷͰɺݟͯΈ·͠ΐ͏
// 条件に合致するものとしないものとで分割する Map<Boolean,List<String>> jstartMap1 = Stream.of("Java", "Groovy", "Scala", "Clojure", "Kotlin",
"Jython", "JRuby") .collect(partitioningBy(s->s.startsWith(“J"))); // grouping() とmapping()の組み合わせ LinkedHashMap<Integer, List<String>> lengthMap = Stream.of("Java", "Groovy", "Scala", "Clojure", "Kotlin", "Jython", "JRuby") .collect(groupingBy(String::length, LinkedHashMap::new, mapping(Objects::toString, toList()))); // 追加の仕上げ処理を施す people.stream().collect(collectingAndThen(toList(), Collections::unmodifiableList)); // reduceはさっき書いたので省略
ग़ݱස͕ߴ͘ͳ͍ͷͰ֮͑ͮΒ ͍͔͠Εͳ͍͕ɺ͍ͬͯΔͱ ΑΓγϯϓϧʹίʔυΛॻ͚·͢
ݸਓతʹ͜ͷลͱؔΠϯλʔ ϑΣʔεΛͪΌΜͱ֮͑ͯΔͱɺ ࣗ࡞ͷCollectorΛ࡞Δͱ͖ʹࠞཚ ͠ͳ͍ͰࡁΉͱࢥͬͯ·͢
࠷ޙʹ
ࠓͷͰಛʹ৽͍͜͠ͱ Կ໊ݴ͍ͯ͠ͳ͍ɻ ଟීஈJavaΛ͍ͬͯΔਓ͢ Ͱʹ࣮ͰͰ͖͍ͯͨΓɺগͳ͘ ͱͲ͔͜Ͱฉ͍͍ͯͨΓ͢Δɻ ࣗେੲ͔Β͍ͬͯͨɻ
ͰͲ͏͍ͯ͠·͞ΒͦΜͳΛ ͠Α͏ͱࢥͬͨͷ͔
None
None
ਓʹฉ͍ͨ ษڧձͰฉ͍ͨ ຊͰಡΜͩ ͜ΕΒͷཧ༝Ͱ͍ͬͯͨΑ͏ͳ ؾʹͳͬͯɺେͯ͠ཧղͰ͖͍ͯ ͳ͔ͬͨɻ ࣮ફͰ͍͜ͳ͍ͤͯͳ͔ͬͨɻ
࣮ફͰΖ͘ʹ͑ͳ͍ࣝͰɺ ʮͦͷٕज़͍ͬͯΔΑʯͱՌ ͨͯ͠ݴ͑ΔͷͰ͠ΐ͏͔
গͳ͘ͱࣗʹͱͬͯͷʮཧղʯ ͱҧ͏ؾ͕͢Δ
ࠓճͷൃදΘ͔͍ͬͯͨؾʹͳͬ ͍ͯͨࣗͷռΊతͳҙຯ͋ ΔͷͰ͢
ࣗ·ͩ·͕ͩࣗࢥ͏ ʮJavaΛཧղͨ͠ʯʹఔԕ͍ͷ Ͱ͢
·ͩ·ͩमߦଓ͘ͷͰ͢