JavaRush /Java Blog /Random-TW /喝咖啡休息#149。如何從 Java 8 升級到 Java 17。在 Java 中迭代列表的不同方法

喝咖啡休息#149。如何從 Java 8 升級到 Java 17。在 Java 中迭代列表的不同方法

在 Random-TW 群組發布

如何從 Java 8 遷移到 Java 17

來源:Medium 使用此出版物,您可以輕鬆地從 Java 8 升級到 Java 17。Java 喝咖啡休息#149。 如何從 Java 8 升級到 Java 17。在 Java 中迭代列表的不同方法 - 1的每個新版本,尤其是長期支援 (LTS) 版本,都為開發人員提供了許多新功能和功能,消除了以前發現的錯誤並提高效能。但到目前為止,儘管 Java 17 發布已近一年,但該語言最受歡迎的版本仍然是 Java 8。許多人對升級猶豫不決,認為新版本的 Java 與以前的版本不完全兼容,並且升級到它需要付出很多努力。個人認為有必要升級。我已經在使用 Java 17,儘管升級時確實遇到了一些問題。此外,值得考慮的是Java 8早已不再是免費服務。Java 17 效能好得多。例如,透過使用 ZGC,您不再需要擔心配置垃圾收集設​​定。如果您想從 Java 8 遷移到 Java 17,則必須做一些額外的工作。由於我已經走了這條路,所以我可以分享我遷移到新版本的經驗。

更新Maven編譯器插件的版本

對於某些開發人員來說,Maven編譯器插件的版本可能太舊。如果您想使用 Java 17,Maven 編譯器外掛程式版本必須至少為 3.5.4。
<插件> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <版本>3.8.1</版本> <設定> <來源>17</來源> <目標>17</目標> </配置> </插件>

更新依賴項

從 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.toolcess.javac.procestoolcess.
由於 Lombok 在編譯時注入生成的程式碼並使用com.sun.tools.javac.*套件 中的類,因此您需要將 Lombok 更新到最新版本。這將解決問題。2.zookeeper連線會拋出UnresolvedAddressException錯誤,錯誤訊息如下:
org.apache.zookeeper.ClientCnxn - 伺服器10.0.*.*/<unresolved>:2181 的會話0x0,意外錯誤,關閉套接字連接並嘗試重新連接java.nio.channels.UnresolvedAddressException:sun.nio.ch 處的 null. Net .checkAddress(Net.java:149) ~[?:?] 在sun.nio.ch.Net.checkAddress(Net.java:157) ~[?:?] 在sun.nio.ch.SocketChannelImpl .checkRemote( SocketChannelImpl .java:816) ~[?:?] 在sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:839) ~[?:?] 在org。 .java: 277 ) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] 在org.apache.zookeeper.ClientCnxnwet. -3.4.13.jar:3 . 4. 13-2d71af4dbe22557fda74f9a9b4309b15a7487f03 ] 在org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[231325.3251325.30021).413. fda74f9a9b4309b15a7487f03] 在org.apache.zookeeper.ClientCnxn$ SendThread.run(ClientCn xn .java:1064) [zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
錯誤的原因是在Java 15中重構了InetSocketAddressHoldertoString方法。如果您使用的是 Maven,則可以使用mvn versions: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> <版本>2.3.0</版本> </依賴項> <依賴項> <groupId>com. sun.xml .bind</groupId> <artifactId>jaxb-core</artifactId> <版本>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId> jaxb-impl</artifactId> <版本>2.3.0</版本> </依賴項>
除此之外,Java 11 還刪除了 Java EE 和 CORBA 模組,因此您必須手動新增 javax 套件。
<依賴項> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <版本>1.3.2</版本> </依賴項>

處理 InaccessibleObjectException

如果您在應用程式中使用反射,尤其是setAccessible(true),那麼您可能會在應用程式啟動時收到InaccessibleObjectException錯誤。此錯誤是由Java平台的模組化系統引起的,該系統僅允許在某些條件下存取:
  1. 課程必須是公開的。
  2. 您必須匯出自己的包。
若要解決此錯誤,您可以手動將模組設為公用。為此,您需要將--add-opens選項新增至 Java 啟動命令列,如下所示。
# --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 中迭代列表:
  • 使用進階的 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 的元素。

將 lambda 函數添加到 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