この記事では、開発者の視点からJavaのバージョン8以降の機能を説明し、開発者がパフォーマンスを向上させるためにそれらをどのように使用できるかを記しています。
本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。
アリババグループのシニア技術専門家、陳利彬(Leijuan)より
PythonやJavaScriptなどのプログラミング言語の人気はますます高まっています。しかし、以前に支配的な言語であったJavaは、多少の好意を失ったにもかかわらず、主要なプログラミング言語のさまざまなランキングでトップの座を維持しています。Javaは、メインストリームのエンタープライズ・アプリケーションのアプリケーション開発の第1位の言語であることに変わりはありません。Java 8の発売以来、Javaはパフォーマンスの向上に役立つ多くの有用な新しい言語機能やツールを導入してきました。しかし、多くのプログラマーは、開発のためにJava 8以降のバージョンにアップグレードしていません。この記事では、開発者の視点から、Java 8以降のバージョンのJava言語機能について説明します。
まず、Java 8は間違いなくほとんどのJavaプログラマーの目には画期的なバージョンでしょう。その最も有名な機能はストリームとラムダ式であり、機能的なプログラミングを可能にし、Javaを活性化させています。これはまさに、Oracleがアップデートを停止したにもかかわらず、多くのクラウドベンダーがJava 8に素晴らしいサポートを提供して、長く活動を続けている理由そのものです。
Alibaba Cloud SDK for Javaのインストール
多くのプログラマが開発のためにJava 8よりも後のバージョンにアップグレードしていないため、後のバージョンの言語機能を取り上げています。この記事では、開発に焦点を当て、ガベージコレクション(GC)、コンパイラ、Javaモジュール、プラットフォームをスキップします。これらのトピックは、他の記事でカバーすることができます。コードを書く上では、以下の機能が役割を果たします。
Java 13がまもなくリリースされるので、Java 9からJava 13までのJavaのバージョンがすべて網羅されています。Javaのリリースは調整されており、バージョンに応じてプレビューが導入され、その後、ユーザーのフィードバックに基づいて補強や改善が行われます。この記事では、どのバージョンにどの機能があるのかを具体的に指摘することはありません。ただ、Java 8以降のすべてのバージョンの機能が混在していると考えていただいて構いません。この記事の参照元は、Java公式サイトの「Features and Pluralsight」のセクションにある各Javaバージョンの詳細な紹介です。
Var - ローカル変数型推論
Javaはジェネリックをサポートしていますが、型が長さをあまり気にしないのであれば、varキーワードを使いましょう。これはあなたのコードを大幅に簡素化します。Java IDEはvarで完全に動作するので、頻繁にコードヒントを扱う必要はありません。
Map<String, List<Map<String,Object>>> store = new ConcurrentHashMap<String, List<Map<String,Object>>>();
Map<String, List<Map<String,Object>>> store = new ConcurrentHashMap<>();
Map<String, List<Map<String,Object>>> store = new ConcurrentHashMap<String, List<Map<String,Object>>>();
//lambda
BiFunction<String, String, String> function1 = (var s1, var s2) -> s1 + s2;
System.out.println(function1.apply(text1, text2));
confdファイルをbinディレクトリにコピーしてconfdを起動します。
sudo cp bin/confd /usr/local/bin
confd
実際には、値をNull値に代入するなど、いくつかの小さな制限が予想されます。しかし、これらは大きな問題ではないので、すぐに始めることができます。
プロセスハンドル
Javaでシステムコマンドを呼び出すことはたまにしかありません。もちろん、そのためにはProcessBuilderを使うことがほとんどです。もう一つの特徴は、他のプロセスの更新情報を取得できるProcessHandleの強化です。ProcessHandleは、すべてのプロセス、特定のプロセスの開始コマンドや開始時刻などを取得するのに役立ちます。
ProcessHandle ph = ProcessHandle.of(89810).get();
System.out.println(ph.info());
コレクションファクトリメソッド
まだ新しいメソッドを使ってArrayListやHashSetを作成していませんか?遅れているかもしれません。ファクトリーメソッドを直接使ってみましょう。
Set<Integer> ints = Set.of(1, 2, 3);
List<String> strings = List.of("first", "second");
文字列クラスの新しいAPI
ここですべての新しい API をリストアップすることは不可能ですが、いくつかの重要な API を使いこなせれば、サードパーティ製の StringUtils を取り除くことができます。次のAPIは、repeat、isEmpty、isBlank、strip、line、indent、transform、trimIndent、formattedです。
HTTP 2 をサポート
OkHTTP 3を使った方が簡単ですが、他の開発パッケージを望まず、HTTP 2に固執したい場合は問題ありません。JavaはHTTP 2をサポートしており、同期型と非同期型の両方のプログラミングモデルをサポートしています。また、コードも基本的には同じです。
HttpClient client = HttpClient.newHttpClient();
HttpRequest req =
HttpRequest.newBuilder(URI.create("https://httpbin.org/ip"))
.header("User-Agent", "Java")
.GET()
.build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(resp.body());
テキストブロック (JDK 13)
以前のバージョンでは、長い文章を入力する必要があり、ダブルクォーテーションを避ける必要があります。可読性が悪くなります。
例えば:
String jsonText = "{"id": 1, "nick": "leijuan"}";
テキストブロックの新方式:
//language=json
String cleanJsonText = """
{"id": 1, "nick": "leijuan"}""";
はるかにシンプルですよね?コードを書くことに集中して、ダブルクォーテーションマークのエスケープやコピーの共有と変換を心配する必要はありません。
ちょっと待ってください、 cleanJsonText の前に追加した //language=json
とは何でしょうか?これはIntelliJ IDEAの機能で、テキストブロックはセマンティックです。HTML、JSON、SQLのコードに //language=json
を追加すると、すぐにコードヒントが出てきます。
テキストブロックは基本的なテンプレートの特性にも対応しています。テキストブロックにコンテキスト変数を導入し、%sと入力し、フォーマットされたメソッドを呼び出します。これであなたの仕事は完了です。
//language=html
String textBlock = """
<span style="color: green">Hello %s</span>""";
System.out.println(textBlock.formatted(nick));
スイッチの改善
Arrow Labels(アローラベル)
スイッチ矢印「→」を導入したことで、そんなにたくさんの改行をする必要がなくなりました。以下にサンプルコードを紹介します。
//legacy
switch (DayOfWeek.FRIDAY) {
case MONDAY: {
System.out.println(1);
break;
}
case WEDNESDAY: {
System.out.println(2);
break;
}
default: {
System.out.println("Unknown");
}
}
//Arrow labels
switch (DayOfWeek.FRIDAY) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
式を切り替える
つまり、スイッチには戻り値があるということです。以下にサンプルコードを示します。
//Yielding a value
int i2 = switch (DayOfWeek.FRIDAY) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> {
yield 10;
}
};
キーワード yield は、スイッチ式の戻り値を表します。
これらの機能の使用
これらの機能はどれもよくできているように見えますが、まだJava 8で作業をしているときに、どうやってこれらの機能を使うことができるでしょうか?これらの機能を検討する以外に、他に何ができるでしょうか?心配しないでください。解決策を見つけました。
この項目は、すべての JDK 12+ 構文を Java 8 VM に透過的にコンパイルすることをサポートしています。言い換えれば、これらの構文をJava 8上で実行することは問題ではありません。これらの機能はすべて、Java 8 環境でも利用可能です。
では、どのようにして使うことができるのでしょうか?それはすべて非常にシンプルで簡単です。
まず、JDK 13などの最新のJDKをダウンロードし、依存関係にjabel-java-pluginを追加します。
<dependency>
<groupId>com.github.bsideup.jabel</groupId>
<artifactId>jabel-javac-plugin</artifactId>
<version>0.2.0</version>
</dependency>
そして、Mavenのコンパイラプラグインを調整し、ソースをJava 13など必要なJavaバージョンに設定します。ターゲットとリリースはJava 8に設定することができます。IntelliJ IDEAは自動認識が可能なので調整の必要はありません。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>13</source>
<target>8</target>
<release>8</release>
</configuration>
</plugin>
さあ、それらの機能を使った快適な体験を始めましょう。
概要
このブログでは、Javaで人気のある便利な機能をいくつか取り上げてきました。APIの調整など、いくつかの便利な機能はこの記事では触れられていません。しかし、ブログやフォーラムを通じて、いつでも私たちのコミュニティと共有することができます。
アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ