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(ਖ਼͘͠͸ͳ͍͚Ͳࡶʹ...) ܁Γฦ͠ॲཧͷfor΍whileΛ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#getResources΋mHost͕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ฦ͢ϝιου(); // s1͸null͔΋͠Εͳ͍... 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