Java 8ユーティリティ


約1年前、java 8に対する理解はまだいくつかの片言の文章に限られていたが、関数式プログラミングに興味を持って、参考書を買って読んで本棚に置いた.その後、大きな顧客アプリケーションの開発を引き継いだ後、java 8のツールは、私の効率を大きく向上させた.だからjava'8のいくつかのよく使われるシーンを記録したいと思っています.これは小さな辞書になって、頻繁に本をめくることを免れることができることを望んでいますが、いつも自分が探している知識を見つけることができます.
例のモデル:
@Data
public class Apple {
    private Long appleId;
    private String appleName;
    private Float appleWeight;
    private Integer appleClassic;
}

一、Java 8 Lambda式
これは間違いなく最もよく使われる機能の一つであり、実際にはlambda式の役割は、簡潔明瞭であるべきであり、実際には最も短い文字で、タイプ導出、文法糖などの方法でコンパイラにこのコードの機能を説明することであり、これは汎用型と少し似ており、プログラマにとって、プログラミング効率とコードの可読性もある程度向上している.
一般的なlambda式:process(()->System.out.println("this is so cool!"))
たとえば、アップルの重量のソート:
   List apples = Lists.newArrayList();
        for (int i = 1; i < 10; i++) {
            Apple apple = new Apple();
            apples.add(apple);
        }
        apples.sort(Comparator.comparing(Apple::getAppleWeight));

  :
        apples.sort(Comparator.comparing(Apple::getAppleWeight).reversed());

     :    :

  apples.sort(Comparator
                .comparing(Apple::getAppleWeight)
                .reversed()

      :

  Predicate a = apple -> apple.getAppleWeight() > 10;
        weight10.or(apple -> apple.getAppleClassic() > 2)
                .and(apple -> StringUtils.equalsIgnoreCase(apple.getAppleName(), "    "));

    (a||b)&&c

    :

        Function f = a -> a.getAppleWeight() + 1;
        Function g = a -> a * 2;
        Function h = f.andThen(g);

         h=g(f(x))

  Function g = a -> a.getAppleWeight() + 1;
        Function f = a -> a * 2;
        Function h = f.compose(g);
      h=f(g(x))

小結:java 8は実際に関数を伝えたいのですが、関数は何ですか.マッピングであり、x->yと見なすことができ、xを入力して値yにマッピングする過程であり、javaはすべてがオブジェクトであるという考えから抜け出すことができないため、関数式はオブジェクトに依存して伝達されるので、以下の説もあり、方法の引用、および関数式インタフェースは、関数をオブジェクトに従って伝達させ、関数式のためにプログラミングし、さらには専門的にインタフェース--オブジェクトを書いて関数を伝達する.しかし、関数こそ主役です.
二、Java 8方法の引用
メソッドの参照は非常に簡単で、実際にはメソッドをパラメータとして渡します.使用::ドメインオペレータを使用して、メソッドを渡します.例:Apple::getAppleIdString::subStringSystem.out::println
三、Java 8関数式インタフェース関数式プログラミング
Javaによる関数式プログラミングは主に関数式インタフェースを利用するが、関数式インタフェースはjava 8以前からいくつかあり、例えばマルチスレッドのrunnableであるが、8以前はlambda式がなかったため、匿名の内部クラスしか使用できなかった.lambda式を使ったことがある人から見れば、それはかなり肥大化しており、8はlambda式を更新し、関数式プログラミングをさらに向上させた.
JAva 8の関数インタフェースは、関数を渡すためのツールを提供しています.関数インタフェースを自分で定義し、他の人やjava APIに呼び出すことができます.関数インタフェースについて、覚えておく必要があるのは2つのことです.関数インタフェースは行為の抽象です.関数インタフェースはデータ変換器です.
四、Java 8 Stream
Java 8のフロー処理に触れたとき、私の第一の感覚はフロー処理が集合操作を簡潔にしたことであり、通常、フロー処理によって1行で実現できる複数のコードが必要である.その本質は、反復などの本来の開発者が必要とする処理をjavaライブラリに配置し、整数を含む集合の中ですべての偶数をフィルタリングし、新しいリストにカプセル化して戻すなど、自分のビジネスロジックだけに関心を持つようにすることです.java 8の前に、次のコードで実現する必要があります.
  :
List evens = new ArrayList<>();
for (final Integer num : nums) {
    if (num % 2 == 0) {
        evens.add(num);
    }
}

stream  :
List evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());

      10     3   ,      ,     ,  ,       Name,           :
 List appleName = apples.parallelStream()
                .filter(a -> a.getAppleClassic() < 2)
                .sorted(Comparator.comparing(Apple::getAppleWeight))
                .map(Apple::getAppleName)
                .map(s -> s.split(""))
                .limit(10)
                .skip(2)
                .distinct()
                .flatMap(Arrays::stream)
                .collect(Collectors.toList());   

  AppleId ApppleName Map:
        Map appleIdMap = apples.stream()
                .collect(Collectors.toMap(Apple::getAppleId, Apple::getAppleName, (s, s2) -> s.length() > s2.length() ? s : s2));

     :      
 if (appleName.stream().anyMatch(a -> StringUtils.equalsIgnoreCase(a, "    ")));
        if (appleName.stream().allMatch(a -> StringUtils.equalsIgnoreCase(a, "    ")));
        if (appleName.stream().noneMatch(a -> StringUtils.equalsIgnoreCase(a, "    ")));

    :
        appleName.stream()
                .filter(a -> StringUtils.equalsIgnoreCase(a, "    "))
                .findAny()
                .ifPresent(System.out::println);
findfirst         ,             ,  findAny。

  :         
    apples.stream()
    .map(Apple::getAppleWeight)
    .reduce(0F, (a, b) -> a + b);

  :
        apples.stream().count();

streamを使用するメリット:1.より簡潔で、より読みやすい2.複合可能、より柔軟3.並列可能
五、Java 8 Optionalクラス
OptionalがjavaのNPE問題の解決に重点を置いているのはJava 8がnullセキュリティ問題を解決するためのAPIである.Optionalを活用することで、コードの多くの煩雑で醜いデザインを優雅にすることができます.
  Optional,                 :
public static String getName(User u) {
    if (u == null)
        return "Unknown";
    return u.name;
}

  ,           。

public static String getName(User u) {
    Optional user = Optional.ofNullable(u);
    if (!user.isPresent())
        return "Unknown";
    return user.get().name;
}

        Optional   。        ,             ,         。
public static String getName(User u) {
    return Optional.ofNullable(u)
                    .map(user->user.name)
                    .orElse("Unknown");
}
     :

public static String getChampionName(Competition comp) throws IllegalArgumentException {
    if (comp != null) {
        CompResult result = comp.getResult();
        if (result != null) {
            User champion = result.getChampion();
            if (champion != null) {
                return champion.getName();
            }
        }
    }
    throw new IllegalArgumentException("The value of param comp isn't available.");
}
       Optional    ,           。
public static String getChampionName(Competition comp) throws IllegalArgumentException {
    return Optional.ofNullable(comp)
            .map(c->c.getResult())
            .map(r->r.getChampion())
            .map(u->u.getName())
            .orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available."));
}

           ,             :

string.ifPresent(System.out::println);

参考資料:『Java 8 in Action:Lambdas,streams,and functional-style programming』Raoul-gabriel Urma(著者)、Mario Fusco(著者)、Alan Mycroft(著者)
作者:文のきらめきはクリックして更に多い详しく见ます