目次
1.オプション
2. ラムダ式を使用する
3. ラムダ式の設計
4.Stream
最後に
ホームページ Java &#&チュートリアル Java 8 開発に関する重要なヒント

Java 8 開発に関する重要なヒント

Feb 23, 2017 am 10:39 AM
java8

私は数年間、新しいアプリケーションと既存のアプリケーションの移行の両方で Java 8 でコーディングしてきましたが、非常に役立つと感じたいくつかの「ベスト プラクティス」について書く時期が来たと感じました。私は個人的に「ベスト プラクティス」という用語が好きではありません。なぜなら、それは「画一的な」ソリューションを意味するからです。コーディングの仕組みはそうではありません。どのようなソリューションが機能するかを自分で発見する必要があるからです。しかし、Java 8 コードで役立つオプションをいくつか見つけたので、見てみましょう。

1.オプション

Optional是一个严重被低估的功能,并且有潜力删除很多困扰我们的NullPointerExceptions。これは、コード境界内 (使用されている API または公開されている API) 内で特に役立ちます。これにより、ユーザーと呼び出しコードが何を期待するかを推論できるようになります。

ただし、何も考えずに Optional を適用すると、多数のクラスに影響を与え、可読性が低下する可能性があります。ここでは、Optional を効果的に使用する方法についてのヒントをいくつか紹介します。

Optional は戻り値の型にのみ使用する必要があります

... パラメータやフィールドではありません。幸いなことに、IntelliJ IDEA では、これらの推奨事項に従っているかどうかを確認するチェックをオンにすることができます。

Java 8 開発に関する重要なヒント

オプションの値は、出現した場所で処理する必要があります。 IntelliJ IDEA の提案により、コード内の Optional リークが防止されるため、Optional を見つけた場合は忘れずに処理し、迅速に行動してください。

Java 8 開発に関する重要なヒント

単純に get() を呼び出すべきではありません

Optional の機能は、この値が空である可能性があることを表現し、この状況に対処できるようにすることです。したがって、何かを行う前に、値があるかどうかを必ず確認してください。 Java 8 開発に関する重要なヒント

可能有更优雅的方式

结合了get()的isPresent()

Java 8 開発に関する重要なヒント

Java 8 開発に関する重要なヒント

get() の isPresent() は確かに良いでしょう...

Java 8 開発に関する重要なヒント

...しかし、もっと洗練された解決策があります。 orElse を使用すると、値が null の場合に代替を提供できます。 🎜🎜🎜🎜

…または、orElseGet を使用して、値が null の場合に呼び出すメソッドを指定することもできます。これは上記の例と同じように見えますが、サプライヤー メソッドは必要な場合にのみ呼び出されるため、これが高価なメソッドである場合は、ラムダを使用した方がパフォーマンスが向上します。

Java 8 開発に関する重要なヒント

2. ラムダ式を使用する

ラムダ式は Java 8 の主な機能の 1 つです。まだ Java 8 を使用したことがない場合でも、おそらくすでに Java 8 についての基本的な理解はできているでしょう。これらは Java でプログラミングする新しい方法であり、「ベスト プラクティス」が何であるかはまだ明らかではありません。ここでは私が従うべきガイドラインをいくつか紹介します。

短くしてください

関数型のプログラマは長いラムダ式のほうが満足しますが、長年 Java に没頭してきた人は、ラムダ式をわずか数行のコードに抑える方が簡単だと感じるでしょう。コードを 1 行に制限すると、長い式をメソッドに簡単にリファクタリングできます。

Java 8 開発に関する重要なヒント

これらはメソッド参照になる可能性もあります。メソッド参照は最初は少し馴染みがないように感じるかもしれませんが、特定の状況での読みやすさに役立つため、実際にはメソッド参照に固執する価値があります。これについては後で説明します。

Java 8 開発に関する重要なヒント

Explicit

ラムダ式には型情報が欠落しているため、パラメーターの型情報を含めると便利な場合があります。

Java 8 開発に関する重要なヒント

ご覧のとおり、今回はかなりぎこちなくなりました。したがって、私はパラメータに便利な名前を付けることを好みます。もちろん、これを行ったかどうかに関係なく、IntelliJ IDEA ではパラメーターの型情報を確認できます。

Java 8 開発に関する重要なヒント

ラムダで表される関数型インターフェイスも:

Java 8 開発に関する重要なヒント

3. ラムダ式の設計

ラムダ式はジェネリックスに少し似ていると思います - ジェネリックスと一緒によく使用します (たとえば、型情報を List<>) に追加できますが、ジェネリック型 (例: Person<T>) を使用してメソッドまたはクラスを設計できることが望ましいです。同様に、Streams API などを使用する場合はラムダ式を渡しますが、ラムダ パラメータを必要とするメソッドを作成する方がさらに良いでしょう。

しかし、このような状況に陥った場合は、いくつかの素晴らしいヒントをご紹介します。

IntelliJ IDEA は関数パラメーターの導入に役立ちます

これにより、オブジェクトの代わりにラムダを渡すパラメーターを作成できます。この機能の利点は、既存の機能インターフェイスが仕様に一致していることを示すことです。

Java 8 開発に関する重要なヒント

この結果は...

既存の関数型インターフェイスの使用

開発者が Java 8 コードに慣れるにつれて、Supplier や Consumer What などのインターフェイスを使用し、ローカルの ErrorMessageCreator を作成すると何が起こるかがわかるようになります(たとえば)混乱を招く可能性があり、無駄が生じる可能性があります。すでに利用可能なものについては、このパッケージをご覧ください。

関数インターフェースに @FunctionalInterface を追加します

実際に独自の関数インターフェースを作成する必要がある場合は、このアノテーションをそのようにマークします。これにはあまり効果がないように見えますが、IntelliJ IDEA は、インターフェイスが関数型インターフェイスに使用される例外と一致しない場合に通知します。オーバーライドするメソッドを指定しない場合は、フラグが付けられます:

Java 8 開発に関する重要なヒント

メソッドを指定しすぎると、フラグが付けられます:

Java 8 開発に関する重要なヒント

そして、それをインターフェースではなくクラスに適用すると、警告が表示されます:

Java 8 開発に関する重要なヒント

ラムダ式は、単一の抽象メソッドを持つどのインターフェースでも使用できますが、同じ標準抽象クラス。非論理的に思えますが、そういうことなのです。

4.Stream

Stream API は Java 8 のもう 1 つの大きな機能ですが、これによってコーディング方法がどれほど変わるかは実際にはわかりません。ここでは私が役に立ったものをいくつか紹介します。

ドット演算子をキューに入れる

私は個人的にストリーム操作をキューに入れることを好みます。もちろん、これを行うと便利だとわかったので、これを行う必要はありません:

  • どのような操作があるか一目でわかります

  • デバッグが簡単になります (ただし、IntelliJ IDEA ではデバッグが可能です) 1 行に好きなだけブレークポイントを設定できる ラムダ式を使用してブレークポイントを設定できますが、別の行に分割すると簡単になります)

  • テスト中のコメントアクション

  • デバッグまたはテスト用に簡単に挿入 peek()

Java 8 開発に関する重要なヒント

さらに、私の意見では、その方がすっきりしています。このパターンに従った場合、コード行を減らすという点ではあまりメリットがありません。

ドット演算子を揃えるために書式設定を調整する必要がある場合があります。

Java 8 開発に関する重要なヒント

メソッド参照の使用

はい、この奇妙な構文に慣れるまでには時間がかかります。ただし、正しく使用すると、可読性が向上します。参照:

Java 8 開発に関する重要なヒント

(比較的) 新しい Objects クラスのヘルパー メソッドとの比較:

Java 8 開発に関する重要なヒント

後者のコードは、どの値が保存されるかについてより明示的です。 IntelliJ IDEA は通常、ラムダをメソッド参照に折りたたむことができる時期を通知します。

Java 8 開発に関する重要なヒント

コレクションを反復処理する場合は、可能であれば Streams API

… または forEach のような新しいコレクション メソッドを使用します。 IntelliJ IDEA からのアドバイスは次のとおりです:

Java 8 開発に関する重要なヒント

一般に、Streams API を使用する方が、ループと if ステートメントを組み合わせて使用​​するよりも明確です。例:

Java 8 開発に関する重要なヒント

IntelliJ IDEA は、これを次のようにリファクタリングできることを示唆しています。

Java 8 開発に関する重要なヒント

私が行ったパフォーマンス テストでは、驚くべきことにこのリファクタリングが示されました - パフォーマンスが常に予測どおりに維持されるわけではなく、改善されますが、さらに悪化します。いつものように、アプリケーションでパフォーマンスが重要な場合は、あるスタイルを別のスタイルにコミットする前にパフォーマンスを測定してください。

配列を反復処理する場合はループを使用します

ただし、Java 8 を使用するからといって、必ずしもどこでもストリームや新しいコレクション メソッドを使用する必要があるわけではありません。 IntelliJ IDEA はストリームへの変換を提案しますが、これは「はい」と答える必要があるという意味ではありません (チェックは抑制またはオフにできることに注意してください)。

特に、プリミティブ型の小さな配列のループは、ほぼ確実にパフォーマンスを向上させ、おそらく (少なくともストリームに慣れていない Java 開発者にとっては) 読みやすくするために使用されます。

Java 8 開発に関する重要なヒント

他の手法と同様、ルールは明確に設定されているわけではありませんが、可能な限り Streams API を使用するか、一部の操作でループを使用するかを決定する必要があります。要するに、一貫性を保つことです。

最後に

上記は、Java 8 開発スキルのトップの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (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を使用して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[

Java8でClockクラスを使用する方法 Java8でClockクラスを使用する方法 Apr 25, 2023 pm 03:37 PM

Java8 の Clock クラス Java8 では、現在のタイムスタンプ、つまり現在のタイムゾーンの日付と時刻の情報を取得するための Clock クラスが追加されています。以前に System.currentTimeInMillis() と TimeZone.getDefault() が使用されていた場合は、Clock に置き換えることができます。 packagecom.shxt.demo02;importjava.time.Clock;publicclassDemo10{publicstaticvoidmain(String[]args){//現在のタイムベースを返します

Java8の日付比較メソッドとは何ですか? Java8の日付比較メソッドとは何ですか? Apr 29, 2023 pm 04:46 PM

Java8 の日付比較メソッド Java8 では、新しい isBefore()、isAfter()、isEqual()、および CompareTo() を使用して、LocalDate、LocalTime、および LocalDateTime を比較できます。 2 つの java.time.LocalDate@TestvoidtestDateCompare4() を比較する次の例では throwsParseException{DateTimeFormattersdf=DateTimeFormatter.ofPattern("yyyy-MM-dd&quot)

Java8でタイムゾーンを扱う方法 Java8でタイムゾーンを扱う方法 Apr 27, 2023 pm 09:22 PM

Java 8 でのタイムゾーンの処理 Java 8 では、日付と時刻を分離するだけでなく、タイムゾーンも分離します。特定のタイム ゾーンを処理する ZoneId や、特定のタイム ゾーンの時間を表す ZoneDateTime など、一連の個別のクラスが追加されました。これは、Java8 より前の GregorianCalendar クラスによって行われていました。次の例は、このタイム ゾーンの時刻を別のタイム ゾーンの時刻に変換する方法を示しています。 packagecom.shxt.demo02;importjava.time.LocalDateTime;importjava.time.ZoneId;importjava.time.ZonedDateT

Java8で現在のタイムスタンプを取得する方法 Java8で現在のタイムスタンプを取得する方法 May 01, 2023 am 11:46 AM

Java8 で現在のタイムスタンプを取得します。Instant クラスには、次に示すように、現在のタイムスタンプを返す静的ファクトリ メソッド now() があります。 Instanttimestamp=Instant.now();System.out.println("このインスタントの値は何ですか"+timestamp.t

Java8で今日の日付を取得する方法 Java8で今日の日付を取得する方法 May 01, 2023 pm 06:49 PM

Java8 で今日の日付を取得する Java8 では、今日の日付を表すために LocalDate が使用されます。 java.util.Date とは異なり、日付のみが含まれ、時刻は含まれません。日付を表すだけが必要な場合は、このクラスを使用します。 packagecom.shxt.demo02;importjava.time.LocalDate;publicclassDemo01{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();System.out.println("今日の日付:&q

Java8 で事前定義された書式設定ツールを使用して日付を解析または書式設定する方法 Java8 で事前定義された書式設定ツールを使用して日付を解析または書式設定する方法 Apr 28, 2023 pm 07:40 PM

事前定義された書式設定ツールを使用して Java8 で日付を解析または書式設定する方法 packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.format.DateTimeFormatter;publicclassDemo17{publicstaticvoidmain(String[]args){StringdayAfterTommorrow="20180205 ";LocalDateformatted =LocalDate.parse

See all articles