Optionalは、nullでないオブジェクトを格納するためのコンテナオブジェクトです。Optionalオブジェクトは、値が存在しない状態を表現するために使用されます。このクラスには、nullチェックを行う代わりに、値を「利用可能」または「利用不可」として扱うためのさまざまなユーティリティメソッドが用意されています。Java 8で導入され、GuavaのOptionalと同様の機能を提供します。 クラス宣言 以下はjava.util.Optional<T>クラスの宣言です: public final class Optional<T> extends Object クラス
ストリームはJava 8で導入された新しい抽象レイヤーです。ストリームを使用すると、SQL文のように宣言的な方法でデータを処理できます。例えば、以下のSQL文を考えてみてください。 SELECT max(salary), employee_id, employee_name FROM Employee このSQL式は、開発者側で計算を行うことなく、最高給与の従業員詳細を自動的に返します。Javaのコレクションフレームワークを使うと、開発者はループを使い繰り返しチェックを行う必要があります。もう一つの懸念は効率性です。マルチコアプロセッサが容易に利用可能になりましたが、Java開発者は並列処理
Java 8では、インターフェースにデフォルトメソッド実装の新しい概念が導入されました。この機能は後方互換性のために追加され、古いインターフェースでJava 8のラムダ式機能を活用できるようになりました。 例えば、ListやCollectionインターフェースにはforEachメソッド宣言がありません。このようなメソッドを単純に追加すると、コレクションフレームワークの実装が単純に壊れてしまいます。Java 8ではデフォルトメソッドを導入し、List/CollectionインターフェースがforEachメソッドのデフォルト実装を持てるようにし、これらのインターフェースを実装するクラスが同じメソ
関数型インターフェースは単一の機能を持ちます。例えば、単一メソッドcompareToを持つComparableインターフェースは比較目的で使用されます。Java 8ではラムダ式で広範囲に使用される多くの関数型インターフェースがjava.util.functionパッケージで定義されています。以下はその一覧です。 番号インターフェースと説明 1BiConsumer<T,U> - 2つの入力引数を受け取り、結果を返さない操作 2BiFunction<T,U,R> - 2つの引数を受け取り、結果を生成する関数 3BinaryOperator<T> - 同
メソッド参照は、メソッドを名前で指し示すのに役立ちます。メソッド参照は「::」シンボルで記述されます。以下のタイプのメソッドを指し示すのに使用できます。 Staticメソッド インスタンスメソッド new演算子を使ったコンストラクタ(TreeSet::new) メソッド参照の例 import java.util.List; import java.util.ArrayList; public class Java8Tester { public static void main(String args[]) { List names = new ArrayLis
ラムダ式はJava 8で導入され、Java 8最大の機能と謳われています。ラムダ式は関数型プログラミングを容易にし、開発を大幅に簡素化します。 構文 ラムダ式は以下の構文で特徴づけられます。 expression body ラムダ式の重要な特徴 型宣言省略可能 - パラメータの型宣言不要。コンパイラが値から推論 パラメータの括弧省略可能 - 単一パラメータなら括弧不要。複数パラメータなら必要 波括弧省略可能 - 本体が単一ステートメントなら波括弧不要 returnキーワード省略可能 - 単一式で値を返す場合、コンパイラが自動的に返却。波括弧がある場合はreturn必要 ラムダ式の例
ローカル環境のセットアップ Javaプログラミング言語用に独自の環境を構築したい場合、このセクションがプロセス全体をガイドします。以下の手順に従ってJava環境をセットアップしてください。 Java SEは以下のリンクから無料でダウンロードできます: https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html OSに基づいてバージョンをダウンロードしてください。ダウンロード手順に従い、.exeを実行してマシンにJavaをインストールします。インストール後、環境変数を設定して正しいインストールデ
Java 8はJavaプログラミング言語開発における主要な機能リリースです。初期バージョンは2014年3月18日にリリースされました。Java 8リリースにより、関数型プログラミングサポート、新しいJavaScriptエンジン、日時操作の新API、新しいストリーミングAPIなどが提供されました。 主な新機能 ラムダ式 - Javaに関数型処理能力を追加 メソッド参照 - 関数を直接呼び出す代わりに名前で参照。関数をパラメータとして使用可能 デフォルトメソッド - インターフェースにデフォルトメソッド実装を持たせられる 新ツール - jdepsなど新しいコンパイラツールとユーティリティ追加(
CompletableFutureクラスはJava 8で導入され、値とステータスを明示的に設定して完了できるFutureを表します。java.util.concurrent.CompletionStageとして使用でき、依存関数とアクションをサポートし、Future完了時にトリガーされます。Java 9ではCompletableFuture APIがさらに拡張されました。主な変更点は以下の通りです。 遅延とタイムアウトのサポート サブクラス化の改善 新しいファクトリメソッドの追加 遅延とタイムアウトのサポート public CompletableFuture<T> comp
Java 9では、異なる解像度のバリエーションを持つ複数の画像をサポートする新しいマルチ解像度イメージAPIが導入されました。このAPIにより、異なる解像度の画像セットを単一のマルチ解像度イメージとして扱えます。主な操作は以下の通りです。 Image getResolutionVariant(double destImageWidth, double destImageHeight) - 指定サイズでこの論理イメージを最もよく表すバリアント画像を取得 List<Image> getResolutionVariants() - すべての解像度バリアントの読み取り可能なリストを取得
OptionalクラスはJava 8で導入され、nullチェックとNullPointerException問題を回避するためのものです。Java 9では機能向上のため3つの新メソッドが追加されました。 stream() ifPresentOrElse() or() stream()メソッド 構文 public Stream<T> stream() 値が存在する場合はその値のみを含む順次ストリームを、存在しない場合は空ストリームを返します。 例 o.isPresent() ? Stream.of(o.get()) : Stream.empty())
ダイヤモンド演算子(<>)はJava 7でコードの可読性向上のため導入されましたが、匿名内部クラスでは使用できませんでした。Java 9では匿名クラスでもダイヤモンド演算子が使用可能になり、コードがシンプルになり可読性が向上しました。 Java 9以前のコード public class Tester { public static void main(String[] args) { Handler<Integer> intHandler = new Handler<Integer>(1) { @Overri
@DeprecatedアノテーションはJava 5で導入されました。このアノテーションが付与されたプログラム要素は、以下の理由で使用すべきではないことを示します。 使用するとエラーにつながる可能性がある 将来のバージョンで互換性がなくなる可能性がある 将来のバージョンで削除される可能性がある より良い効率的な代替手段が存在する コンパイラは非推奨要素が使用されると警告を生成します。Java 9では@Deprecatedアノテーションに2つの新しい拡張が加えられました。 forRemoval - 注釈付き要素が将来のバージョンで削除対象かどうかを示す。デフォルト値はfalse since
try-with-resources文は、1つ以上のリソースを適切に宣言するtry文です。ここでリソースとは、不要になったら閉じるべきオブジェクトのことです。try-with-resources文は、各リソースが処理完了後に確実に閉じられることを保証します。java.lang.AutoCloseableまたはjava.io.Closeableインターフェースを実装するオブジェクトをリソースとして使用できます。 Java 9以前では、リソースをtryの前またはtry文内で宣言する必要がありました。以下の例では、BufferedReaderをリソースとして文字列を読み取り、その後閉じています。
ストリームはJava 8で導入され、オブジェクトのシーケンスから集約操作を行うのを支援します。Java 9では、ストリームをより使いやすくするいくつかのメソッドが追加されました。 takeWhile(Predicate) 構文 default Stream<T> takeWhile(Predicate<? super T> predicate) takeWhileは、述語がfalseを返すまでのすべての値を取得します。順序付きストリームの場合、与えられた述語に一致する要素の最長プレフィックスで構成されるストリームを返します。 例 !s.isEmpty())
Java 9では、OSプロセスの制御・管理を担当するProcess APIが大幅に改善されました。ProcessHandleクラスで、プロセスのネイティブPID、開始時刻、累積CPU時間、引数、コマンド、ユーザー、親プロセス、子孫プロセスなどの情報を取得できます。また、プロセスの生存確認と破棄のメソッドも提供されます。onExitメソッドにより、CompletableFutureでプロセス終了時の非同期アクション実行が可能です。 Tester.java - プロセス情報取得例 Stream.of(a).collect(Collectors.joining( ))).orElse(np));
Java 8以前では、インターフェースには以下のタイプの変数/メソッドのみ定義可能でした。 定数変数 抽象メソッド つまり、インターフェースにメソッド実装、より正確にはデフォルト実装を持たせることはできませんでした。例を見てみましょう。 Java 8での改善:デフォルトメソッドとstaticメソッド Java 8からインターフェースに以下が追加されました。 定数変数 抽象メソッド デフォルトメソッド Staticメソッド 共通処理(DB接続の開閉など)をインターフェースのデフォルトメソッドとstaticメソッドにまとめることで、実装クラスでの重複を排除できます。 Java 9での
Java 9では、List、Set、Mapインターフェースに不変インスタンスを作成する新しいファクトリメソッドが追加されました。これらのファクトリメソッドは、コレクションをより冗長でない簡潔な方法で作成するための便利なメソッドです。 従来のコレクション作成方法 import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.u
Java 9では、JAR形式が拡張され、異なるバージョンのJavaクラスやリソースをプラットフォームに応じて保持・使用できるようになりました。JAR内のMANIFEST.MFファイルのメインセクションにMulti-Release: trueエントリを追加します。META-INFディレクトリにversionsサブディレクトリが含まれ、そのサブディレクトリ(Java 9なら9から始まる)にバージョン固有のクラスとリソースファイルを格納します。 この例では、マルチリリースJARを使ってTester.javaの2つのバージョン(JDK 7用とJDK 9用)を持ち、異なるJDKバージョンで実行します。
Javaドキュメントはjavadocツールで生成できます。従来はHTML 4.0形式で生成されていましたが、Java 9ではコマンドライン引数に-html5オプションを指定することでHTML 5形式でドキュメントを生成できます。 従来のJavaドキュメント(HTML 4.0) C:/JAVAフォルダに以下のコードがあるとします。 Tester.java /** * @author MahKumar * @version 0.1 */ public class Tester { /** * デフォルトメソッド:実行して出力 * <p>Hello
Java