Java 8 開発に関する重要なヒント
私は数年間、新しいアプリケーションと既存のアプリケーションの移行の両方で Java 8 でコーディングしてきましたが、非常に役立つと感じたいくつかの「ベスト プラクティス」について書く時期が来たと感じました。私は個人的に「ベスト プラクティス」という用語が好きではありません。なぜなら、それは「画一的な」ソリューションを意味するからです。コーディングの仕組みはそうではありません。どのようなソリューションが機能するかを自分で発見する必要があるからです。しかし、Java 8 コードで役立つオプションをいくつか見つけたので、見てみましょう。
1.オプション
Optional
是一个严重被低估的功能,并且有潜力删除很多困扰我们的NullPointerExceptions
。これは、コード境界内 (使用されている API または公開されている API) 内で特に役立ちます。これにより、ユーザーと呼び出しコードが何を期待するかを推論できるようになります。
ただし、何も考えずに Optional を適用すると、多数のクラスに影響を与え、可読性が低下する可能性があります。ここでは、Optional を効果的に使用する方法についてのヒントをいくつか紹介します。
Optional は戻り値の型にのみ使用する必要があります
... パラメータやフィールドではありません。幸いなことに、IntelliJ IDEA では、これらの推奨事項に従っているかどうかを確認するチェックをオンにすることができます。
オプションの値は、出現した場所で処理する必要があります。 IntelliJ IDEA の提案により、コード内の Optional リークが防止されるため、Optional を見つけた場合は忘れずに処理し、迅速に行動してください。
単純に get() を呼び出すべきではありません
Optional の機能は、この値が空である可能性があることを表現し、この状況に対処できるようにすることです。したがって、何かを行う前に、値があるかどうかを必ず確認してください。
可能有更优雅的方式
结合了get()的isPresent()

isPresent()
は確かに良いでしょう...
…または、orElseGet
を使用して、値が null の場合に呼び出すメソッドを指定することもできます。これは上記の例と同じように見えますが、サプライヤー メソッドは必要な場合にのみ呼び出されるため、これが高価なメソッドである場合は、ラムダを使用した方がパフォーマンスが向上します。
2. ラムダ式を使用する
ラムダ式は Java 8 の主な機能の 1 つです。まだ Java 8 を使用したことがない場合でも、おそらくすでに Java 8 についての基本的な理解はできているでしょう。これらは Java でプログラミングする新しい方法であり、「ベスト プラクティス」が何であるかはまだ明らかではありません。ここでは私が従うべきガイドラインをいくつか紹介します。
短くしてください
関数型のプログラマは長いラムダ式のほうが満足しますが、長年 Java に没頭してきた人は、ラムダ式をわずか数行のコードに抑える方が簡単だと感じるでしょう。コードを 1 行に制限すると、長い式をメソッドに簡単にリファクタリングできます。
Explicit
ラムダ式には型情報が欠落しているため、パラメーターの型情報を含めると便利な場合があります。
ご覧のとおり、今回はかなりぎこちなくなりました。したがって、私はパラメータに便利な名前を付けることを好みます。もちろん、これを行ったかどうかに関係なく、IntelliJ IDEA ではパラメーターの型情報を確認できます。
ラムダで表される関数型インターフェイスも:
3. ラムダ式の設計
ラムダ式はジェネリックスに少し似ていると思います - ジェネリックスと一緒によく使用します (たとえば、型情報を List<>) に追加できますが、ジェネリック型 (例: Person<T>
) を使用してメソッドまたはクラスを設計できることが望ましいです。同様に、Streams API などを使用する場合はラムダ式を渡しますが、ラムダ パラメータを必要とするメソッドを作成する方がさらに良いでしょう。
しかし、このような状況に陥った場合は、いくつかの素晴らしいヒントをご紹介します。
IntelliJ IDEA は関数パラメーターの導入に役立ちます
これにより、オブジェクトの代わりにラムダを渡すパラメーターを作成できます。この機能の利点は、既存の機能インターフェイスが仕様に一致していることを示すことです。
この結果は...
既存の関数型インターフェイスの使用
開発者が Java 8 コードに慣れるにつれて、Supplier
や Consumer What などのインターフェイスを使用し、ローカルの ErrorMessageCreator を作成すると何が起こるかがわかるようになります(たとえば)混乱を招く可能性があり、無駄が生じる可能性があります。すでに利用可能なものについては、このパッケージをご覧ください。
関数インターフェースに @FunctionalInterface を追加します
実際に独自の関数インターフェースを作成する必要がある場合は、このアノテーションをそのようにマークします。これにはあまり効果がないように見えますが、IntelliJ IDEA は、インターフェイスが関数型インターフェイスに使用される例外と一致しない場合に通知します。オーバーライドするメソッドを指定しない場合は、フラグが付けられます:
メソッドを指定しすぎると、フラグが付けられます:
そして、それをインターフェースではなくクラスに適用すると、警告が表示されます:
ラムダ式は、単一の抽象メソッドを持つどのインターフェースでも使用できますが、同じ標準抽象クラス。非論理的に思えますが、そういうことなのです。
4.Stream
Stream API は Java 8 のもう 1 つの大きな機能ですが、これによってコーディング方法がどれほど変わるかは実際にはわかりません。ここでは私が役に立ったものをいくつか紹介します。
ドット演算子をキューに入れる
私は個人的にストリーム操作をキューに入れることを好みます。もちろん、これを行うと便利だとわかったので、これを行う必要はありません:
どのような操作があるか一目でわかります
デバッグが簡単になります (ただし、IntelliJ IDEA ではデバッグが可能です) 1 行に好きなだけブレークポイントを設定できる ラムダ式を使用してブレークポイントを設定できますが、別の行に分割すると簡単になります)
テスト中のコメントアクション
デバッグまたはテスト用に簡単に挿入
peek()
さらに、私の意見では、その方がすっきりしています。このパターンに従った場合、コード行を減らすという点ではあまりメリットがありません。
ドット演算子を揃えるために書式設定を調整する必要がある場合があります。
メソッド参照の使用
はい、この奇妙な構文に慣れるまでには時間がかかります。ただし、正しく使用すると、可読性が向上します。参照:
(比較的) 新しい Objects
クラスのヘルパー メソッドとの比較:
後者のコードは、どの値が保存されるかについてより明示的です。 IntelliJ IDEA は通常、ラムダをメソッド参照に折りたたむことができる時期を通知します。
コレクションを反復処理する場合は、可能であれば Streams API
… または forEach
のような新しいコレクション メソッドを使用します。 IntelliJ IDEA からのアドバイスは次のとおりです:
一般に、Streams API を使用する方が、ループと if ステートメントを組み合わせて使用するよりも明確です。例:
IntelliJ IDEA は、これを次のようにリファクタリングできることを示唆しています。
私が行ったパフォーマンス テストでは、驚くべきことにこのリファクタリングが示されました - パフォーマンスが常に予測どおりに維持されるわけではなく、改善されますが、さらに悪化します。いつものように、アプリケーションでパフォーマンスが重要な場合は、あるスタイルを別のスタイルにコミットする前にパフォーマンスを測定してください。
配列を反復処理する場合はループを使用します
ただし、Java 8 を使用するからといって、必ずしもどこでもストリームや新しいコレクション メソッドを使用する必要があるわけではありません。 IntelliJ IDEA はストリームへの変換を提案しますが、これは「はい」と答える必要があるという意味ではありません (チェックは抑制またはオフにできることに注意してください)。
特に、プリミティブ型の小さな配列のループは、ほぼ確実にパフォーマンスを向上させ、おそらく (少なくともストリームに慣れていない Java 開発者にとっては) 読みやすくするために使用されます。
他の手法と同様、ルールは明確に設定されているわけではありませんが、可能な限り Streams API を使用するか、一部の操作でループを使用するかを決定する必要があります。要するに、一貫性を保つことです。
最後に
上記は、Java 8 開発スキルのトップの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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

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