JavaRush /Java блог /Random UA /Кава-брейк #149. Як перейти з Java 8 на Java 17. Різні сп...

Кава-брейк #149. Як перейти з Java 8 на Java 17. Різні способи перебору списку Java

Стаття з групи Random UA

Як перейти з Java 8 на Java 17

Джерело: Medium Використовуючи цю публікацію, ви зможете без проблем виконати апгрейд версії мови Java 8 на Java 17. Кава-брейк #149.  Як перейти з Java 8 на Java 17. Кожен новий реліз Java, особливо якщо йдеться про версію з довгостроковою підтримкою (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.
<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 викликає помилку компіляції. Інформація про помилку виглядає так:
Помічник execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) на проекті cloud-common: Детальний error compiling: java.lang. .tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler не "opens com.sun.tools.javac.processing
Оскільки Lombok вставляє згенерований код під час компіляції та використовує класи пакети com.sun.tools.javac.* , вам потрібно оновити Lombok до останньої версії. Це вирішить проблему. 2. З'єднання zookeeper видасть помилку UnresolvedAddressException , інформація про помилку виглядає так:
org.apache.zookeeper.ClientCnxn - Session 0x0 for server 10.0.*.*/<unresolved>:2181, unexpected error, closing socket connection and attempting reconnect java.nio.channels.UnresolvedAddressException: null null. .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(ClientCn ) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] at org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxja .13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15 ientCnxn$SendThread.run(ClientCnxn. java:1064) [zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
Причина помилки в тому, що Java 15 провели рефакторинг методу toString для InetSocketAddressHolder . Якщо ви використовуєте maven, можете застосувати команду mvn versions:display-dependency-updates для перевірки оновлень залежностей. Результат буде виглядати так: Кава-брейк #149.  Як перейти з Java 8 на Java 17.

Додайте залежність

Якщо компілюєтеся за допомогою JAXB, то отримаєте повідомлення про помилку. А все тому, що JAXB видалено з Java 11. Тому вам необхідно додати деякі залежності 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>
На додаток до цього, Java 11 також видаляє модулі Java EE та CORBA, тому вам доведеться вручну додавати пакети javax.
<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>

Обробка виключення InaccessibleObjectException

Якщо ви використовуєте у своєму додатку reflection, особливо setAccessible(true) , то ви, ймовірно, отримаєте помилку InaccessibleObjectException при запуску програми. Помилка викликає модульна система платформи Java, яка дозволяє доступ тільки за певних умов:
  1. Клас має бути загальнодоступним.
  2. Ви повинні експортувати власні пакети.
Щоб усунути цю помилку, ви можете вручну вказати модуль загальнодоступним. Для цього вам потрібно додати параметр --add-opens до командного рядка запуску Java, як показано нижче.
# --add-opens has following syntax: {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 - 3Фреймворк Collection має інтерфейс List, який дозволяє нам підтримувати впорядковану колекцію об'єктів. Інтерфейс List реалізується ArrayList, LinkedList, Stack та Vector. Значна кількість Java-додатків використовують ArrayList та LinkedList. Для перебору списку є кілька способів, кожен із яких має особливості.

Як перебрати список у Java

Ви можете використовувати три способи для ітерації списку Java:
  • Використання розширеного методу For Loop.
  • Використання методу ітератора.
  • Перебір елементів длякожного.

1. Використання розширеного методу For Loop.

Це версія базового циклу 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. Перебір елементів длякожного.

Після додавання до 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
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ