JavaRush /Java 博客 /Random-ZH /喝咖啡休息#149。如何从 Java 8 升级到 Java 17。在 Java 中迭代列表的不同方法

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

已在 Random-ZH 群组中发布

如何从 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.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: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.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$ 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