Java9シリーズのパート7:Java.util。オプションの最適化と拡張

次の期間にJava9に関する一連の記事を書く予定です。Java9はJava8やJava11のようなコアJavaバージョンではありませんが、注目に値する機能はまだたくさんあります。あなたの注意を楽しみにして、私はjava 9を一連の記事、約10の記事に書きます、この記事は7番目です。

java.util.Optionalこれは、Java 8バージョンで追加された新しいクラスであり、プログラミングプロセスでのNullPointExceptionの問題をある程度改善できます。Java 9では、このクラスを拡張するためにいくつかの新しいメソッドが追加されています。一緒に見て、Java8での使用法を確認してみましょう。

一、Java9的ifPresentOrElse(コンシューマー、実行可能)

1.1。Java9の機能強化

値がある場合、この新しいメソッドは指定されたコンシューマー操作を実行します。それ以外の場合は、指定された実行可能操作を実行します。次のコードは、最初にJava 8のストリームを使用して3の倍数をフィルタリングし、次にfindFirstを使用して3の最初の倍数を検索します。そのような値が見つかった場合は、プリントコンソールに出力します。値が見つからなかった場合は、「3の倍数が見つかりません」と出力します。

ifPresentOrElse(Consumer、Runnable)のセマンティクスは、次のように解釈できます。ifPresentがConsumer、OrElseがRunnable。これは、Java9でのみ使用可能な拡張メソッドです。

 IntStream.of(1, 2, 4)
          .filter(i -> i % 3 == 0)
          .findFirst()
          .ifPresentOrElse(System.out::println, () -> {  
              System.out.println("没有找到3的倍数");
          });

1、2、4には3の倍数がないため、出力結果は次のようになります。

没有找到3的倍数

次の2、6、および8アレイがフィルタリングされた場合、最終的なコンソール出力結果は次のようになります。

 IntStream.of(2, 6, 8)
          .filter(i -> i % 3 == 0)
          .findFirst()
          .ifPresentOrElse(System.out::println, () -> {
              System.out.println("没有找到3的倍数");
          });   // 6

1.2。Java8での記述を確認します

Java 8オプション.isPresent():

Java 8を使用する場合、ifPresentOrElse(Consumer,Runnable)方法はありません。上記と同じコードを次のように記述する必要があります。ifとelseを記述して、自分で判断します。同じ出力:3の倍数が見つかりませんでした

 OptionalInt opt = IntStream.of(1, 2, 4)
                            .filter(i -> i % 3 == 0)
                            .findFirst();
 if (opt.isPresent()) {
     System.out.println(opt.getAsInt());
 } else {
     System.out.println("没有找到3的倍数");
 }

Java 8オプション.ifPresent():

ifPresent()値が存在しない場合、このメソッドはオプションの操作を提供しません。したがって、次のコードが実行された後は、orElseアクションも出力もありません。これは、あまりわかりにくいものです。

 IntStream.of(1, 2, 4)
          .filter(i -> i % 3 == 0)
          .findFirst()
          .ifPresent(System.out::println);

Java 8オプション.orElse():

orElse()このメソッドは、valueの戻り値が空になった後にデフォルト値を提供します。以下のコードでは、デフォルト値の-1が示されています。

 int result = IntStream.of(1, 2, 4)
                       .filter(i -> i % 3 == 0)
                       .findFirst()
                       .orElse(-1);
 System.out.println(result);   //-1

二、Java9的Optional.or(サプライヤー)

このメソッドは、値が見つからない場合に新しいオプションを生成します。次のコードは配列['a'、 'b'、 'c']をフィルタリングし、isDigitは配列に数字があるかどうかを判断します。明らかに数字がないため、findFirstはそのような値を見つけることができません。したがって、デフォルト値を生成します。Optional.of('0')

 char digit = Stream.of('a', 'b', 'c')
                    .filter(e -> Character.isDigit(e))
                    .findFirst()
                    .or(() -> Optional.of('0')).get();
 System.out.println(digit);   //0

Java8のOrElseGet()

Java8のOptional.orElseGet()メソッドにも同じ機能があります。次のコードは配列['a'、 'b'、 'c']をフィルタリングし、isDigitは配列に数字があるかどうかを判断します。明らかに数字がないため、findFirstはそのような値を見つけることができません。したがって、orElseGetを介してデフォルト値を取得します。'0'

 char result = Stream.of('a', 'b', 'c')
                    .filter(c -> Character.isDigit(c))
                    .findFirst()
                    .orElseGet(()->'0');
 System.out.println(result);   //0

3、Java9のOptional.stream()

この場合、Optional.stream()メソッドは最大要素を1つだけ含むStreamを返します。値が存在しない場合、空のストリームが返されます。

 OptionalInt opt1 = IntStream.of(2, 5, 6).max();  //求最大值
 OptionalInt opt2 = IntStream.of(1, 3, 7).max();  //求最大值
 IntStream.concat(opt1.stream(), opt2.stream())  //将2个流合并
          .forEach(System.out::println);   //将合并后的流数据打印

コンソールの出力は次のとおりです。

 6
 7

私のブログをフォローすることを歓迎します、多くのブティックコレクションがあります

  • この記事は、出典を示して複製されています(接続を添付する必要があり、テキストのみを複製することはできません):レターブラザーのブログ

あなたがそれがあなたに役立つと思うなら、私のためにそれを好きにして共有してください!あなたのサポートは私の尽きることのない創造的な動機です!また、最近、以下のような高品質なコンテンツを出力しておりますので、よろしくお願いいたします。

おすすめ

転載: blog.csdn.net/hanxiaotongtong/article/details/109173363