JavaRush /Blog Java /Random-VI /Nghỉ giải lao #149. Cách nâng cấp từ Java 8 lên Java 17. ...

Nghỉ giải lao #149. Cách nâng cấp từ Java 8 lên Java 17. Các cách khác nhau để lặp qua danh sách trong Java

Xuất bản trong nhóm

Cách di chuyển từ Java 8 sang Java 17

Nguồn: Medium Sử dụng ấn phẩm này, bạn có thể dễ dàng nâng cấp từ Java 8 lên Java 17. Nghỉ giải lao #149.  Cách nâng cấp từ Java 8 lên Java 17. Các cách khác nhau để lặp qua danh sách trong Java - 1 Mỗi bản phát hành Java mới, đặc biệt nếu chúng ta đang nói về phiên bản hỗ trợ dài hạn (LTS), cung cấp cho các nhà phát triển nhiều tính năng và chức năng mới, loại bỏ lỗi được phát hiện trước đó và cải thiện hiệu suất. Nhưng cho đến nay, mặc dù Java 17 đã được phát hành cách đây gần một năm nhưng phiên bản phổ biến nhất của ngôn ngữ này vẫn là Java 8. Nhiều người ngần ngại nâng cấp vì tin rằng phiên bản Java mới không tương thích hoàn toàn với các phiên bản trước, và việc nâng cấp lên nó sẽ đòi hỏi rất nhiều nỗ lực. Cá nhân tôi nghĩ việc nâng cấp là cần thiết. Tôi hiện đang sử dụng Java 17, mặc dù tôi gặp một số vấn đề khi nâng cấp. Ngoài ra, điều đáng lưu ý là Java 8 từ lâu đã không còn là một dịch vụ miễn phí. Hiệu suất Java 17 tốt hơn nhiều. Ví dụ: bằng cách sử dụng ZGC, bạn không còn phải lo lắng về việc định cấu hình cài đặt thu gom rác. Nếu muốn chuyển từ Java 8 sang Java 17, bạn sẽ phải thực hiện thêm một số công việc. Vì tôi đã đi theo con đường này nên tôi có thể chia sẻ kinh nghiệm của mình trong việc chuyển sang phiên bản mới.

Cập nhật phiên bản plugin trình biên dịch Maven

Đối với một số nhà phát triển, phiên bản plugin trình biên dịch Maven có thể đã quá cũ. Nếu bạn muốn làm việc với Java 17, phiên bản plugin trình biên dịch Maven tối thiểu phải là 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>

Cập nhật phần phụ thuộc

Bước đầu tiên khi nâng cấp từ Java 8 lên Java 17 là cập nhật các phần phụ thuộc của bạn. Vì phần phụ thuộc mà bạn sử dụng ban đầu có thể hoàn toàn không hỗ trợ Java 17 nên bạn sẽ phải cập nhật phần phụ thuộc này nếu muốn giảm thiểu tác động của việc nâng cấp phiên bản. Nếu không, bạn có thể phải đối mặt với một số vấn đề. 1. Ví dụ: Lombok sẽ gây ra lỗi biên dịch. Thông tin lỗi như sau:
Không thể thực thi mục tiêu org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) trên dự án encloud-common: Biên dịch lỗi nghiêm trọng: java.lang.ExceptionInInitializerError: Không thể tạo trường riêng tư com.sun .tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs có thể truy cập được: mô-đun jdk.compiler không "mở com.sun.tools.javac.processing" thành mô-đun chưa đặt tên
Vì Lombok chèn mã được tạo vào thời gian biên dịch và sử dụng các lớp từ gói com.sun.tools.javac.* nên bạn cần cập nhật Lombok lên phiên bản mới nhất. Điều này sẽ giải quyết vấn đề. 2. Kết nối của người quản lý vườn thú sẽ đưa ra lỗi UnresolvedAddressException , thông tin lỗi như sau:
org.apache.zookeeper.ClientCnxn - Phiên 0x0 dành cho máy chủ 10.0.*.*/<unresolved>:2181, lỗi không mong muốn, đóng kết nối ổ cắm và cố gắng kết nối lại java.nio.channels.UnresolvedAddressException: null tại sun.nio.ch. Net .checkAddress(Net.java:149) ~[?:?] tại sun.nio.ch.Net.checkAddress(Net.java:157) ~[?:?] tại sun.nio.ch.SocketChannelImpl.checkRemote( SocketChannelImpl .java:816) ~[?:?] tại sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:839) ~[?:?] tại org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java: 277 ) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] tại org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:287) ~[zookeeper-3.4.13.jar:3 .4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03 ] tại org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] tại org.apache.zookeeper.ClientCnxn$ SendThread.run (Khách hàngCnxn . java:1064) [zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
Lý do xảy ra lỗi là trong Java 15, phương thức toString cho InetSocketAddressHolder đã được cấu trúc lại . Nếu bạn đang sử dụng maven, bạn có thể sử dụng lệnh mvnversions:display-dependency-updates để kiểm tra các bản cập nhật phụ thuộc. Kết quả sẽ như thế này: Nghỉ giải lao #149.  Cách nâng cấp từ Java 8 lên Java 17. Các cách khác nhau để lặp qua danh sách trong Java - 2

Thêm một phụ thuộc

Nếu bạn biên dịch bằng JAXB, bạn sẽ gặp lỗi. Điều này là do JAXB đã bị xóa khỏi Java 11. Vì vậy, bạn cần thêm một số phụ thuộc JAXB Maven.
<dependency> <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> <version>2.3.0</version> </dependency>
Ngoài ra, Java 11 còn loại bỏ các mô-đun Java EE và CORBA, do đó bạn sẽ phải thêm các gói javax theo cách thủ công.
<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>

Xử lý ngoại lệ đối tượng không thể truy cập

Nếu bạn sử dụng tính năng phản chiếu trong ứng dụng của mình, đặc biệt là setAccessible(true) thì bạn có thể sẽ nhận được lỗi InaccessibleObjectException khi ứng dụng khởi động. Lỗi xảy ra do hệ thống mô-đun của nền tảng Java, hệ thống này chỉ cho phép truy cập trong một số điều kiện nhất định:
  1. Lớp học phải được công khai.
  2. Bạn phải xuất các gói của riêng bạn.
Để khắc phục lỗi này, bạn có thể đặt mô-đun ở chế độ công khai theo cách thủ công. Để thực hiện việc này, bạn cần thêm tùy chọn --add-opens vào dòng lệnh khởi động Java như hiển thị bên dưới.
# --add-opens có cú pháp sau: {modules}/{package}=ALL-UNNAMED java --add-opens java.base/java.lang=ALL-UNNAMED
Hoặc bạn có thể thay đổi mã Java của mình để giải quyết vấn đề này.
module java.base {
    exports java.lang;
}
Nhìn chung, sau khi giải quyết tất cả các vấn đề trên, ứng dụng của bạn sẽ chạy tốt trên Java 17. Tôi hy vọng bài viết này sẽ giúp bạn chuyển sang Java 17.

Các cách khác nhau để lặp lại danh sách trong Java

Nguồn: Rrtutors Trong bài viết này, chúng ta sẽ tìm hiểu một số cách lặp qua một danh sách trong Java. Nghỉ giải lao #149.  Cách nâng cấp từ Java 8 lên Java 17. Các cách khác nhau để lặp qua danh sách trong Java - 3Khung Bộ sưu tập có giao diện Danh sách cho phép chúng ta duy trì một bộ sưu tập các đối tượng theo thứ tự. Giao diện Danh sách được triển khai bởi ArrayList, LinkedList, Stack và Vector. Một số lượng đáng kể các ứng dụng Java sử dụng ArrayList và LinkedList. Có một số cách để lặp qua một danh sách, mỗi cách đều có những đặc điểm riêng.

Cách lặp qua danh sách trong Java

Bạn có thể sử dụng ba cách để lặp lại danh sách trong Java:
  • Sử dụng phương pháp For Loop nâng cao.
  • Sử dụng phương pháp lặp.
  • Lặp lại các phần tử forEach.

1. Sử dụng phương pháp For Loop nâng cao.

Đây là phiên bản của vòng lặp for cơ bản có thể được sử dụng để lặp qua danh sách. Đây là một ví dụ:
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+ " ");
        }
            }
}
Phần kết luận:
100 200 300 400

2. Sử dụng phương pháp lặp.

Bạn cũng có thể sử dụng các trình vòng lặp để lặp lại danh sách. Trình vòng lặp đặc biệt hữu ích khi bạn cần sửa đổi danh sách lặp lại. Ví dụ:
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();
                        }

            }
            }
}
Phần kết luận:
100 200 300

3. Lặp lại các phần tử forEach.

Sau khi các hàm lambda được thêm vào Java, cú pháp ngôn ngữ đã giới thiệu hàm forEach, cho phép bạn lặp lại bất kỳ bộ sưu tập nào. Ví dụ về mã sau đây cho thấy cách bạn có thể sử dụng phương thức forEach để lặp qua danh sách:
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);
            }
}
Phần kết luận:
1 2 3 4
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION