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

Кофе-брейк #149. Как перейти с Java 8 на Java 17. Различные способы перебора списка в Java

Статья из группы Random

Как перейти с Java 8 на Java 17

Источник: Medium Используя эту публикацию, вы сможете без проблем выполнить апгрейд версии языка Java 8 на Java 17. Кофе-брейк #149. Как перейти с Java 8 на Java 17. Различные способы перебора списка в Java - 1Каждый новый релиз 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 вызовет ошибку компиляции. Информация об ошибке выглядит следующим образом:
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) on project encloud-common: Fatal error compiling: java.lang.ExceptionInInitializerError: Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler does not "opens com.sun.tools.javac.processing" to unnamed module
Поскольку 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 at 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] at org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:287) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] at org.apache.zookeeper.ClientCnxn$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. Различные способы перебора списка в Java - 2

Добавьте зависимость

Если вы компилируете с помощью 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 the 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.
  • Использование метода итератора.
  • Перебор элементов forEach.

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. Перебор элементов 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
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Павел Уровень 11
6 августа 2022
Легче на Kotlin мигрировать)