JavaRush /Java Blog /Random-JA /コーヒーブレイク#149。Java 8 から Java 17 にアップグレードする方法。Java でリストを反復処...

コーヒーブレイク#149。Java 8 から Java 17 にアップグレードする方法。Java でリストを反復処理するさまざまな方法

Random-JA グループに公開済み

Java 8 から Java 17 に移行する方法

出典: Medium この出版物を使用すると、Java 8 から Java 17 に簡単にアップグレードできます。Java コーヒーブレイク#149。 Java 8 から Java 17 にアップグレードする方法。Java でリストを反復処理するさまざまな方法 - 1の各新しいリリース (特に長期サポート (LTS) バージョンについて話している場合) は、開発者に多くの新機能を提供します。以前に発見されたエラーを修正し、パフォーマンスを向上させます。しかし、これまでのところ、Java 17 がほぼ 1 年前にリリースされたにもかかわらず、この言語で最も人気のあるバージョンは依然として Java 8 です。多くの人は、Java の新しいバージョンには以前のバージョンと完全な互換性がないと信じており、アップグレードをためらっています。それにアップグレードするには多大な労力が必要になります。個人的にはバージョンアップが必要だと思います。私はすでに Java 17 を使用していますが、アップグレードでいくつかの問題が発生しました。さらに、Java 8 が無料サービスではなくなって久しいことを考慮する価値があります。Java 17 のパフォーマンスははるかに優れています。たとえば、ZGC を使用すると、ガベージ コレクションの設定について心配する必要がなくなります。Java 8 から Java 17 に移行する場合は、追加の作業を行う必要があります。私はすでにこの道を歩んできたので、新しいバージョンへの移行に関する私の経験を共有できます。

Maven コンパイラ プラグインのバージョンを更新する

一部の開発者にとって、Maven コンパイラー プラグインのバージョンが古すぎる可能性があります。Java 17 で作業する場合は、Maven コンパイラー プラグインのバージョンが少なくとも 3.5.4 である必要があります。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>17</source> <target>17</target> </configuration> </plugin>

依存関係を更新する

Java 8 から Java 17 にアップグレードする場合の最初のステップは、依存関係を更新することです。最初に使用していた依存関係はおそらく Java 17 をまったくサポートしていないため、バージョン アップグレードの影響を最小限に抑えたい場合は更新する必要があります。そうしないと、さまざまな問題が発生する可能性があります。1. たとえば、Lombok ではコンパイル エラーが発生します。エラー情報は以下のとおりです。
プロジェクト encloud-common でのゴール org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) の実行に失敗しました: コンパイル中の致命的なエラー: java.lang.ExceptionInInitializerError: フィールドをプライベート com.sun にできません.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs アクセス可能: モジュール jdk.compiler は名前のないモジュールに対して「com.sun.tools.javac.processing を開きません」
Lombok はコンパイル時に生成されたコードを挿入し、 com.sun.tools.javac.*パッケージ のクラスを使用するため、Lombok を最新バージョンに更新する必要があります。これで問題は解決します。2. Zookeeper 接続はUnresolvedAddressExceptionエラーをスローします。エラー情報は次のとおりです。
org.apache.zookeeper.ClientCnxn - サーバー 10.0.*.*/<unresolved>:2181 のセッション 0x0、予期しないエラー、ソケット接続を閉じて再接続しようとしています java.nio.channels.UnresolvedAddressException: null (sun.nio.ch)。 Net .checkAddress(Net.java:149) ~[?:?] at sun.nio.ch.Net.checkAddress(Net.java:157) ~[?:?] at sun.nio.ch.SocketChannelImpl.checkRemote( SocketChannelImpl .java:816) ~[?:?] at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:839) ~[?:?] at org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java: 277 ) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:287) ~[zookeeper-3.4.13] .jar:3 .4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03 ] org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] org.apache.zookeeper.ClientCnxn$ に送信Thread.run(ClientCnxn .java:1064) [zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
エラーの理由は、Java 15 でInetSocketAddressHoldertoStringメソッドがリファクタリングされたことです。Maven を使用している場合は、mvn version:display-dependency-updatesコマンドを使用して依存関係の更新を確認できます。結果は次のようになります。 コーヒーブレイク#149。 Java 8 から Java 17 にアップグレードする方法。Java でリストを反復処理するさまざまな方法 - 2

依存関係を追加する

JAXB でコンパイルすると、エラーが発生します。これは、JAXB が Java 11 から削除されたためです。そのため、JAXB Maven 依存関係をいくつか追加する必要があります。
<依存関係> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml .bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId> jaxb-impl</artifactId> <バージョン>2.3.0</version> </dependency>
これに加えて、Java 11 では Java EE および CORBA モジュールも削除されるため、javax パッケージを手動で追加する必要があります。
<依存関係> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <バージョン>1.3.2</version> </dependency>

InaccessibleObjectException の処理

アプリケーション、特にsetAccessible(true)でリフレクションを使用する場合、アプリケーションの起動時にInaccessibleObjectExceptionエラーが発生する可能性があります。このエラーは、特定の条件下でのみアクセスを許可する Java プラットフォームのモジュラー システムによって発生します。
  1. クラスはパブリックである必要があります。
  2. 独自のパッケージをエクスポートする必要があります。
このエラーを解決するには、モジュールを手動でパブリックに設定します。これを行うには、次に示すように、Java 起動コマンド ラインに --add-opensオプションを追加する必要があります。
# --add-opens の構文は次のとおりです: {modules}/{package}=ALL-UNNAMED java --add-opens java.base/java.lang=ALL-UNNAMED
または、Java コードを変更して、最終的にこの問題を解決することもできます。
module java.base {
    exports java.lang;
}
全体として、上記の問題をすべて解決すると、アプリケーションは Java 17 で正常に動作するはずです。この記事が Java 17 への移行に役立つことを願っています。

Java でリストを反復処理するさまざまな方法

出典: Rrtutors この記事では、Java でリストを反復処理するいくつかの方法を学びます。 コーヒーブレイク#149。 Java 8 から Java 17 にアップグレードする方法。Java でリストを反復処理するさまざまな方法 - 3Collection フレームワークには、オブジェクトの順序付けられたコレクションを維持できるようにする List インターフェイスがあります。List インターフェイスは、ArrayList、LinkedList、Stack、および Vector によって実装されます。かなりの数の Java アプリケーションが ArrayList と LinkedList を使用します。リストを反復処理するにはいくつかの方法があり、それぞれに独自の特徴があります。

Java でリストを反復処理する方法

Java でリストを反復するには、次の 3 つの方法を使用できます。
  • 高度な For ループ方法を使用します。
  • イテレータメソッドを使用します。
  • forEach 要素を反復処理します。

1. 高度な For ループ方法を使用します。

これは、リストの反復処理に使用できる基本的なforループのバージョンです。以下に例を示します。
import java.util.ArrayList;
import java.util.List;
public class Enhanced_for_loop {
            public static void main(String[] args) {
        List<Integer> figurez = new ArrayList<>();
        figurez.add(100);
        figurez.add(200);
        figurez.add(300);
        figurez.add(400);
        for(int i: figurez) {
            System.out.print(i+ " ");
        }
            }
}
結論:
100 200 300 400

2. イテレータメソッドを使用します。

イテレータを使用してリストを反復処理することもできます。イテレータは、反復可能なリストを変更する必要がある場合に特に便利です。例:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Iterate_List_using_Iterators {
            public static void main(String[] args) {
                        List<Integer> numbari = new ArrayList<>();
                        numbari.add(100);
                        numbari.add(200);
                        numbari.add(300);
                    Iterator<Integer> itr = numbari.iterator();
                    while(itr.hasNext()) {
                        int i = itr.next();
                        System.out.print(i+ " ");
                        if(i==3) {
                            itr.remove();
                        }

            }
            }
}
結論:
100 200 300

3. forEach 要素を反復処理します。

ラムダ関数が Java に追加された後、言語構文に forEach 関数が導入されました。これにより、任意のコレクションを反復処理できるようになります。次のコード例は、forEach メソッドを使用してリストを反復処理する方法を示しています。
import java.util.ArrayList;
import java.util.List;
public class Iterate_List_using_ForeEach_iterable {
            public static void main(String[] args) {
                        List<Integer> numbari = new ArrayList<>();
                        numbari.add(1);
                        numbari.add(2);
                        numbari.add(3);
                        numbari.add(4);
                        numbari.forEach(System.out::println);
            }
}
結論:
1 2 3 4
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION