目次
Optional<String> optStr = Optional.empty();
User
ログイン後にコピー
" >
User
ログイン後にコピー
三. 注意事项
ホームページ Java &#&チュートリアル オプションのクラス、Java 8 の新機能

オプションのクラス、Java 8 の新機能

Feb 23, 2017 am 10:30 AM
java8 オプションのクラス 新機能

要約: Optional は null キーワードの代替ではありませんが、null 判定のより洗練された実装を提供します

NullPointException は、Java が最初から設計されていないにもかかわらず、すべての Java プログラマーが遭遇する例外であると言えます。私たちはプログラマをポインタの苦痛から解放しようとしましたが、ポインタは実際に存在し、Java 設計者は Java 言語でポインタをよりシンプルで使いやすくすることしかできませんが、ポインタを完全に排除することはできません。そのため、キーワード

null
ログイン後にコピー
ログイン後にコピー

があるのです。私たちが毎日目にしているもの。

Null ポインター例外は実行時例外です。明確な処理戦略がない場合、ベスト プラクティスはプログラムを早期にハングアップさせることです。ただし、多くのシナリオでは、開発者はそうしません。特定の処理戦略はありませんが、null ポインター例外の存在をまったく認識しません。例外が発生した場合の処理​​戦略も、例外が存在する箇所に if ステートメントの判定を追加するだけで十分です。ただし、このような応答戦略では、プログラム内でより多くの null 判定が発生することになります。コード内の null キーワードの出現を最小限に抑える必要があり、java8 によって提供される

Optional
ログイン後にコピー

クラスは、NullPointException を減らすだけでなく、コードの美しさを向上させます。ただし、最初に、これは

null
ログイン後にコピー
ログイン後にコピー
キーワードの代替ではなく、NullPointException を回避するための null 判定のより洗練された実装を提供するものであることを明確にする必要があります。

1. 直感的なエクスペリエンス

サードパーティのツールクラスを使用しない場合、

if(null ==) メソッドを呼び出す必要があるとします。 str) { // Null ポインタを決定する

return 0;
}
return str.length();
Optional クラスを使用する場合、実装は次のようになります:

return Optional.ofNullable(str).map(String: :length).orElse(0);
Optional コードは比較的簡潔ですが、コード量が多いとnull判定を忘れてしまいがちですが、Optionalクラスを使うことでそのような問題を回避できます。



2. 基本的な使用方法

1. オブジェクトの作成

Optional<String> optStr = Optional.empty();

上記のコード例は、

str.length()
ログイン後にコピー
メソッドを呼び出します。空の
empty()
ログイン後にコピー

オブジェクトタイプ。

オブジェクトの作成: 空にすることはできません

オプションは、空でないオブジェクトを作成するためのメソッド

Optional<String>
ログイン後にコピー

を提供します。このメソッドでは、渡されるパラメーターを空にすることができません。それ以外の場合は、
of()
ログイン後にコピー
がスローされます。次のように:

Optional< ;String> optStr = Optional.of(str); // str が null の場合、NullPointException がスローされます

オブジェクトを作成します: 空であることが許可されます


渡されたパラメータは null 値の可能性があるため、Optional の

NullPointException
ログイン後にコピー

メソッドを使用してオブジェクトを作成できます。入力パラメータが null の場合は、空のオブジェクトが作成されます。例は次のとおりです: Optional<String> optStr = Optional.ofNullable(str); // str が null の場合、ストリーミング処理

2. ストリーミング処理も java8 によって提供されます。コレクションをより簡潔かつ効率的に操作できるようにする強力な新機能 Java 8 の新機能に関する次の記事では、チャーン処理について包括的に説明します。ここではオプションで、マッピングとフィルタリングという 2 つの基本的なチャーン処理も提供します。

デモンストレーションのために、次のような

ofNullable()
ログイン後にコピー

クラスを設計しました:

User
ログイン後にコピー

携帯電話と電子メールは個人には必要ないため、オプションの定義を使用します。



マッピング: マップと flatMap


マッピングは、入力を別の形式の出力に変換する操作です。たとえば、前の例では、文字列を入力し、その文字列の長さを出力します。シュート、これを達成するために

/**
 * @author: zhenchao.Wang 2016-9-24 15:36:56
 */
public class User {
    /** 用户编号 */
    private long id;
    private String name;
    private int age;
    private Optional phone;
    private Optional<String> email;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 省略setter和getter
}
ログイン後にコピー

メソッドを使用します。人の名前を取得したいとすると、次のように実装できます:

String name = Optional.ofNullable(user).map(User::getName).orElse("no name");このように、入力パラメータ user が空でない場合、その名前が返され、それ以外の場合は

map()
ログイン後にコピー

が返されます。 上記のメソッドを通じて電話やメールを取得したい場合、map の後に返されるものは次のとおりであるため、上記のメソッドは機能しません。オプションで、これをオプションのネストと呼びます。必要な結果を取得するには、一度マップする必要があります:

longphone = optUser.map(User::getPhone).map(Optional::get).orElse(-1L);

In実際、現時点では、 flatMap を使用して 1 ステップで必要な結果を取得する方が良い方法です:


long Phone = optUser. flatMap(User::getPhone).orElse(-1L);
flapMap は各ストリームをフラット化できますストリームになるメソッドによって返されます。これについては、ストリーミング処理に特化した次の記事で詳しく説明します。

フィルター: filterer

filter は、名前が示すように、18 歳以上の成人をフィルターする目的を達成するためにフィルター操作をパラメーターとしてこのメ​​ソッドに渡すことができます。 3. デフォルトの動作


デフォルトの動作は、上記の例で使用したような条件を満たさない場合に実行される操作です

orElse()
ログイン後にコピー

就是一个默认操作,用于在Optional对象为空时执行特定操作,当然也有一些默认操作是当满足条件的对象存在时执行的操作。

get()

get用于获取变量的值,但是当变量不存在时则会抛出

NoSuchElementException
ログイン後にコピー

,所以如果不确定变量是否存在,则不建议使用

orElse(T other)

当Optional的变量不满足给定条件时,则执行orElse,比如前面当str为null时,返回0。

orElseGet(Supplier<? extends X> expectionSupplier)
ログイン後にコピー

如果条件不成立时,需要执行相对复杂的逻辑,而不是简单的返回操作,则可以使用orElseGet实现:

long phone = optUser.map(User::getPhone).map(Optional::get).orElseGet(() -> {
    // do something here
    return -1L;
});
orElseThrow(Supplier<? extends X> expectionSupplier)
ログイン後にコピー

与get()方法类似,都是在不满足条件时返回异常,不过这里我们可以指定返回的异常类型。

ifPresent(Consumer)

当满足条件时执行传入的参数化操作。

三. 注意事项

Optional是一个final类,未实现任何接口,所以当我们在利用该类包装定义类的属性的时候,如果我们定义的类有序列化的需求,那么因为Optional没有实现Serializable接口,这个时候执行序列化操作就会有问题:

public class User implements Serializable{
    /** 用户编号 */
    private long id;
    private String name;
    private int age;
    private Optional phone;  // 不能序列化
    private Optional<String> email;  // 不能序列化
ログイン後にコピー

不过我们可以采用如下替换策略:

private long phone;
public Optional<Long> getPhone() {
    return Optional.ofNullable(this.phone);
}
ログイン後にコピー

看来Optional在设计的时候就没有考虑将它作为类的字段使用~

 以上就是Java8 新特性之 Optional 类 的内容,更多相关内容请关注PHP中文网(www.php.cn)!

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java 8で1年前または1年後の日付を計算するにはどうすればよいですか? Java 8で1年前または1年後の日付を計算するにはどうすればよいですか? Apr 26, 2023 am 09:22 AM

Java8 は、minus() メソッドを使用して 1 年前の日付または 1 年後の日付を計算し、1 年前の日付を計算します。 packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[ ]args ){LocalDatetoday=LocalDate.now();LocalDateprevious Year=today.minus(1,ChronoUni

Java 8 のオプション クラス: orElseThrow() メソッドを使用して null の可能性がある値を処理する方法 Java 8 のオプション クラス: orElseThrow() メソッドを使用して null の可能性がある値を処理する方法 Jul 30, 2023 pm 01:57 PM

Java8 のオプション クラス: orElseThrow() メソッドを使用して null の可能性のある値を処理する方法 はじめに: Java 開発では、null の可能性のある値を処理する状況によく遭遇します。 Java の以前のバージョンでは、通常、値が存在しないことを示すために null を使用しました。ただし、null を使用すると、null かどうかを頻繁に判定する必要があり、null ポインタ例外が発生しやすいなどの問題があります。これらの問題を解決するために、Java8 では、

PHP 8.3 リリース: 新機能の概要 PHP 8.3 リリース: 新機能の概要 Nov 27, 2023 pm 12:52 PM

PHP8.3 リリース: 新機能の概要 テクノロジーが発展し、ニーズが変化するにつれて、プログラミング言語は常に更新され、改善されています。 Web 開発で広く使用されているスクリプト言語として、PHP は開発者により強力で効率的なツールを提供するために絶えず改良されてきました。最近リリースされた PHP 8.3 バージョンには、待望の新機能と改善点が多数含まれています。これらの新機能の概要を見てみましょう。 null 以外のプロパティの初期化 PHP の過去のバージョンでは、クラス プロパティに明示的に値が割り当てられていない場合、その値は

PHP8 の新機能を学び、最新テクノロジーを深く理解するためのガイド PHP8 の新機能を学び、最新テクノロジーを深く理解するためのガイド Dec 23, 2023 pm 01:16 PM

最新テクノロジーを習得するために役立つ、PHP8 の新機能の詳細な分析 PHP プログラミング言語は、時間の経過とともに常に進化し、改善されています。最近リリースされた PHP8 バージョンは、開発者に多くのエキサイティングな新機能と改善を提供し、開発作業にさらなる利便性と効率をもたらします。この記事では、PHP8 の新機能を詳しく分析し、これらの最新テクノロジーをよりよく習得するのに役立つ具体的なコード例を提供します。 JIT コンパイラー PHP8 では JIT (Just-In-Time) コンパイルが導入されています

Java 8を使用して1週間後の日付を計算するにはどうすればよいですか? Java 8を使用して1週間後の日付を計算するにはどうすればよいですか? Apr 21, 2023 pm 11:01 PM

Java8 で 1 週間後の日付を計算する方法 この例では、1 週間後の日付を計算します。 LocalDate 日付には時間情報が含まれません。その plus() メソッドは、日、週、月を追加するために使用されます。これらの時間単位は ChronoUnit クラスで宣言されます。 LocalDate も不変型なので、戻った後に変数を使用して値を割り当てる必要があります。 packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo08{publicstaticvoidmain(String[

Java 8 のオプション クラス: flatMap() メソッドを使用して複数レベルのネストされた null 値を処理する方法 Java 8 のオプション クラス: flatMap() メソッドを使用して複数レベルのネストされた null 値を処理する方法 Jul 31, 2023 pm 10:33 PM

Java8 のオプション クラス: flatMap() メソッドを使用して、null の可能性があるマルチレベルのネストされた値を処理する方法 はじめに: ソフトウェア開発では、null の可能性のある値を扱う状況によく遭遇します。以前は、オブジェクトが空かどうかをチェックするために if-else ステートメントを使用することもできましたが、このアプローチは冗長でエラーが発生しやすいものでした。 Java 8 では、オプションの非 null 値を含めることができるコンテナ オブジェクトである Optional クラスが導入されました。 Optional クラスを使用すると、より簡潔で安全になります。

php8の新機能は何ですか php8の新機能は何ですか Sep 25, 2023 pm 01:34 PM

php8 の新機能には、JIT コンパイラ、型推論、名前付きパラメータ、共用体型、プロパティ、エラー処理の改善、非同期プログラミングのサポート、新しい標準ライブラリ関数、匿名クラス拡張機能が含まれます。詳細な紹介: 1. JIT コンパイラー、PHP8 は、重要なパフォーマンスの向上である JIT コンパイラーを導入します。JIT コンパイラーは、一部の高頻度の実行コードをリアルタイムでコンパイルおよび最適化できるため、実行速度が向上します。2. 型導出、PHP8型推論機能を導入し、開発者が変数宣言時などに変数の型を自動的に推測できるようにします。

Go 言語の新機能の解釈: プログラミングをより効率的にする Go 言語の新機能の解釈: プログラミングをより効率的にする Mar 10, 2024 pm 12:27 PM

【Go言語の新機能解説:プログラミングを効率化するには具体的なコード例が必要】 近年、ソフトウェア開発の分野でGo言語が注目を集めており、そのシンプルで効率的な設計思想がますます注目を集めています。開発者。 Go 言語は静的型付けプログラミング言語として、開発効率を向上させ、コード作成プロセスを簡素化するための新機能を導入し続けています。この記事では、Go 言語の最新機能を詳しく説明し、これらの新機能によってもたらされる利便性を具体的なコード例を通じて体験する方法について説明します。モジュール開発(GoModules) 1からのGo言語

See all articles