Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Lightweight-Stream-API ͷ͋ΔAndroidΞϓϦ։ൃ ୈ1ճελʔτΞοϓAndroidษڧձ
Slide 2
Slide 2 text
About Me Shinobu Okano @operandoOS Mercari, Inc. Souzoh, Inc.
Slide 3
Slide 3 text
No content
Slide 4
Slide 4 text
Lightweight-Stream-API? "Stream API from Java 8 rewritten on iterators for Java 7 and below." https://github.com/aNNiMON/Lightweight-Stream-API
Slide 5
Slide 5 text
Lightweight-Stream-API? AndroidͰ͑Δʂʂ
Slide 6
Slide 6 text
Lightweight-Stream-API? Ϡλʔ
Slide 7
Slide 7 text
Lightweight-Stream-API Includes • Functional interfaces • Stream/IntStream • Optional class • Exceptional class • Objects from Java 7
Slide 8
Slide 8 text
Stream͚ͩ͡Όͳ͍ΜͰʔʂʂ Lightweight-Stream-API Includes
Slide 9
Slide 9 text
ͪͳΈʹ... • Lightweight-Stream-API໊ͬͯલ͕͍... • LSAͬͯ༁ͬ͢Ά͍ • READMEʹLSAͬͯهड़͕͋ͬͨ • ࢿྉͳ͍ͰLSAͱॻ͍ͯ͋Δͷ Lightweight-Stream-APIͱ͍͏ҙຯͰ͢
Slide 10
Slide 10 text
Stream
Slide 11
Slide 11 text
Stream? Java 8Ͱಋೖ͞ΕͨAPI
Slide 12
Slide 12 text
Stream? "A sequence of elements supporting sequential and parallel aggregate operations."
Slide 13
Slide 13 text
Stream(ਖ਼͘͠ͳ͍͚Ͳࡶʹ...) ܁Γฦ͠ॲཧͷforwhileΛStreamʹͯ͠ ύΠϓϥΠϯతʹॲཧ͢Δ
Slide 14
Slide 14 text
Lightweight-Stream-API • "without parallel processing but with a variety of additional methods and with custom operators" • parallelఏڙ͞Ε͍ͯͳ͍
Slide 15
Slide 15 text
Lightweight-Stream-API ≠ Java 8 Stream • ΠίʔϧͰͳ͍ • Java 8 Stream APIͷΑ͏ͳΠϯλʔϑΣΠε ͬͨͷ
Slide 16
Slide 16 text
StreamͷྲྀΕ • Streamͷੜ • தؒૢ࡞ (map,filter,etc.) • ͋ΔετϦʔϜΛผͷετϦʔϜʹม͢Δૢ࡞ • ऴૢ࡞ (forEach,count,collect,etc.) • ݁Ռ·ͨ෭࡞༻Λੜ͢Δૢ࡞
Slide 17
Slide 17 text
Java 8 Stream • είΞͷList͔Β30Ҏ্ͷͷΛදࣔ͢Δ • Java 8ͷCollectionʹStreamʹม͢Δϝιου͕͋Δ List scores = Arrays.asList(100, 30, 35, 20); scores.stream() // Streamͷੜ .filter(score -> score >= 30) // தؒૢ࡞ .forEach(System.out::println); // ऴૢ࡞
Slide 18
Slide 18 text
for • είΞͷList͔Β30Ҏ্ͷͷΛදࣔ͢Δ for (Integer score : scores) { if (score >= 30) { System.out.println(score); } }
Slide 19
Slide 19 text
Java 8 Parallel Stream • parallelStream()Ͱฒྻॲཧ • ฒྻͰॲཧ͢ΔͷͰ݁Ռͷॱ൪มΘΔՄೳੑ͕͋Δ List scores = Arrays.asList(100, 30, 35, 20); scores.parallelStream() .filter(score -> score >= 30) .forEach(System.out::println);
Slide 20
Slide 20 text
Lightweight-Stream-API • είΞͷList͔Β30Ҏ্ͷͷΛදࣔ͢Δ • Stream.ofͰStreamΛ࡞Δ List scores = Arrays.asList(100, 30, 35, 20); Stream.of(scores) // Streamͷੜ .filter(score -> score >= 30) // தؒૢ࡞ .forEach(System.out::println); // ऴૢ࡞
Slide 21
Slide 21 text
ग़ྗ͡Όͳͯ͘Listʹ͍ͨ͠ʂ(Lightweight-Stream-API) • ऴૢ࡞Λcollectʹ͢Δ͚ͩͳͷͰ؆୯ʂ List scores = Arrays.asList(100, 30, 35, 20); List filteredScores = Stream.of(scores) .filter(score -> score >= 30) .collect(Collectors.toCollection(ArrayList::new));
Slide 22
Slide 22 text
தؒૢ࡞ɺऴૢ࡞ͷϝιου৭ʑ͋Δ! • શ෦આ໌Ͱ͖ͳ͍ͷͰɺjavadocͱ͔Έͯࢼͯ͠Ͷʂ • େମ΄͍͠ͱࢥ͏ػೳἧͬͯΔͣ • Stream - Lightweight-Stream-API javadoc • http://static.javadoc.io/com.annimon/stream/ 1.1.3/com/annimon/stream/Stream.html
Slide 23
Slide 23 text
Lightweight-Stream-API • AndroidͰJava 8ͷStreamͬΆ͍ͷ͕͑Δʂ • தؒૢ࡞ͱऴૢ࡞ಉ͡Ͱॻ͚Δ • ྲྀΕΔΑ͏ʹॲཧΛॻ͚ΔͷͰؾ͍͍࣋ͪ! • Javaྗ UP • Java 9ͰStreamʹՃ͞ΕΔfunction͑Δ! • good-bye for??
Slide 24
Slide 24 text
Optional
Slide 25
Slide 25 text
Optional? "A container object which may or may not contain a non-null value."
Slide 26
Slide 26 text
Optional?(ࡶ) Λϥοϓͯ͠null͔͠Εͳ͍ ͜ͱΛදݱ͢ΔΫϥε
Slide 27
Slide 27 text
good-bye NullPointerException? NO
Slide 28
Slide 28 text
Optional - Java 8 Optional optional = OptionalΛฦ͢ϝιου(); // nullͰͳ͚Εදࣔ͞ΕΔ optional.ifPresent(System.out::println);
Slide 29
Slide 29 text
Optional - Lightweight-Stream-API Optional optional = OptionalΛฦ͢ϝιου(); // nullͰͳ͚Εදࣔ͞ΕΔ optional.ifPresent(System.out::println);
Slide 30
Slide 30 text
ಉ͡☺
Slide 31
Slide 31 text
Optional + Android • Android SDKͷAPIͬͯࢥͬͨҎ্ʹnullΛฦ͢ͷ͕ଟ͍ • υΩϡϝϯτಡΜͰʮ͑?nullฦΔͷ?ʯͱΔͷʑ • FragmentͶʔgetContextͱ͔getActivityͱ͔… • ίʔυϨϏϡʔͰ͔ͭͬͭΕͨ͘ͳ͍… • Fragment#getResourcesmHost͕nullͩͱ IllegalStateException
Slide 32
Slide 32 text
Fragment#getContext() "Return the Context this fragment is currently associated with." https://developer.android.com/reference/android/support/v4/app/Fragment.html#getContext()
Slide 33
Slide 33 text
Fragment#getContext() • nullฦΔΜ public Context getContext() { return mHost == null ? null : mHost.getContext(); }
Slide 34
Slide 34 text
Fragment + Optional public static Optional 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(); });
Slide 35
Slide 35 text
Fragment + Optional public static Optional getOptionalFragmentActivity(Fragment fragment) { if (fragment.isDetached()) { return Optional.empty(); } return Optional.ofNullable(fragment.getActivity()); } // menuͷߋ৽ // ҆શ! FragmentUtil.getOptionalFragmentActivity(this) .ifPresent(FragmentActivity::supportInvalidateOptionsMenu);
Slide 36
Slide 36 text
Fragment + Optional public static Optional getArguments(Fragment fragment) { return Optional.ofNullable(fragment.getArguments()); } // ҆શ! FragmentUtil.getArguments(this) .ifPresent(bundle -> { // bundle͔ΒΛऔΓग़͢ });
Slide 37
Slide 37 text
ෳͷOptionalΛѻ͏ • Optional AͱOptional Bͷ྆ํ͕nullͰͳ͚Ε...Έ͍ͨͳύλʔϯ • ͦͦ͜ΕͰਖ਼͍͠ͷ͔Θ͔Βͳ͍... Optional optionalFragmentActivity = FragmentUtil.getOptionalFragmentActivity(this); Optional titleOptional = titleOptional(); optionalFragmentActivity.ifPresent(fragmentActivity -> { titleOptional.ifPresent(title -> { fragmentActivity.setTitle(title); }); });
Slide 38
Slide 38 text
ෳͷOptionalΛѻ͏ • 2ͭͷOptionalʹ͕ೖ͍ͬͯΕ TupleΛOptionalͰϥοϓͯ͠ฦ͢ • ͜ΕͳΒͲ͏ͩ
Slide 39
Slide 39 text
ෳͷOptionalΛѻ͏ public static Optional> flatMapPair(Optional a, Optional 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()); });
Slide 40
Slide 40 text
ෳͷOptionalΛѻ͏ public static Optional> flatMapTriplet(Optional a, Optional b, Optional c) { if (a.isPresent() && b.isPresent() && c.isPresent()) { return Optional.ofNullable( Triplet.create(a.get(), b.get(), c.get())); } else { return Optional.empty(); } }
Slide 41
Slide 41 text
No content
Slide 42
Slide 42 text
Ͱ JavaʹTupleͳ͍Μ...
Slide 43
Slide 43 text
Guild • • Simple java tuples. • https://github.com/operando/Guild
Slide 44
Slide 44 text
LSAͷOptionalʹ͔͠ͳ͍ศརͳϝιου • Optional.stream() • Optional͔ΒStreamʹมͰ͖Δ • ଞʹ͍͔ͭ͋͘Δ… Optional.ofNullable(integers) .stream() .forEach(System.out::println);
Slide 45
Slide 45 text
Java 8Ͱಉ͜͡ͱΛ͢Δͱ • Ұखؒඞཁ Optional.ofNullable(integers) .map(integers1 -> integers1.stream()) .orElse(Stream.empty()) .forEach(System.out::println);
Slide 46
Slide 46 text
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
Slide 47
Slide 47 text
Optional • AndroidͰJava 8ͷOptionalͱಉ͡Α͏ͳͷ͕͑Δ • Javaྗ UP • ifͰnullνΣοΫ͢ΔΑΓࣗવͳײ͡ͰϓϩάϥϜ͕ॻ͚Δ • null͕ͳ͘ͳΔΘ͚Ͱͳ͍ • ѻ͍͕͍͜͠ͱ͋Δ • Optionalͷϥοϓͯ͠Δ͕nullͩͬͨ࣌ͷॲཧΛΕΔͱ͔...
Slide 48
Slide 48 text
Objects
Slide 49
Slide 49 text
Objects͍͍ͧʂ • Java 7͔ΒՃ͞ΕͨAPI • AndroidͰminSdkVersion 19Ҏ্͡Όͳ͍ ͱJava 7ͷAPI͑ͳ͍ͣ
Slide 50
Slide 50 text
Objects͍͍ͧʂ • ̎ͭͷจࣈྻΛൺֱ͍ͨ͠ String s1 = Stringฦ͢ϝιου(); String s2 = Stringฦ͢ϝιου(); // s1null͔͠Εͳ͍... s1.equals(s2); // Objects - Lightweight-Stream-API // ͲͪΒ͔͕nullͰ҆શ! Objects.equals(s1,s2);
Slide 51
Slide 51 text
Andorid N minSdkVersion 24 • Java 8ͷAPI͕͍͔ͭ͘ೖͬͯΔ • StreamͱOptionalೖͬͯΔ • ଞʹ͍͔ͭ͘… • Lightweight-Stream-APIΘͳͯ͘Α͍ • minSdkVersion 24...Կઌ?
Slide 52
Slide 52 text
Android-Java-8-Stream-Example • Lightweight-Stream-APIͷ࡞ऀ͕AndroidͰ Java 8ͬΆ͘ॻ͘αϯϓϧΛॻ͍ͯΔ • https://github.com/aNNiMON/Android- Java-8-Stream-Example
Slide 53
Slide 53 text
·ͱΊ • Lightweight-Stream-APIΛ͑ AndroidͰStreamͬΆ͍ͷͱOptional͕͑Δ • Javaྗ UPʹͭͳ͕Δ • Android։ൃͷJavaͩͱJava 6,7Ͱٕज़͕ࢭ·ͬͯ͠·͏Մೳੑ… • ͱҰॹʹ։ൃ͢ΔਓʹJavaͷྗ͚ͭͯ΄͍͠ • Java 9དྷग़ΔͷͰJavaࣗମʹؔ৺Λʂ
Slide 54
Slide 54 text
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
Slide 55
Slide 55 text
Thanks