Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java8を1年使ってみて思ったこと

Avatar for ftsan ftsan
October 11, 2016
170

 Java8を1年使ってみて思ったこと

Avatar for ftsan

ftsan

October 11, 2016

Transcript

  1. 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());
  2. 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());
  3. 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; });
  4. 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());
  5. ୅දతͳؔ਺ܕΠϯλʔϑΣʔε 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ʙͩͱҾ਺͕̎ͭͷόʔδϣϯɺΈ͍ͨͳײ͡ʣ
  6. ͜ͳ͍ͩݟͨɺΘΓͱ͋Γ͕ͪͳίʔυ 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); } }
  7. ͜ͳ͍ͩݟͨɺΘΓͱ͋Γ͕ͪͳίʔυ 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͕ฦΔ
  8. ͋Δ΂͖ίʔυ 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͕ฦΔՄೳੑ͕͋ Δ͜ͱΛݺͼग़͠ݩʹ఻͑Δ΂ ͖ɻ
  9. // 条件に合致するものとしないものとで分割する 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はさっき書いたので省略