JavaRush /Blog Java /Random-PL /Przerwa kawowa #149. Jak dokonać aktualizacji z Java 8 do...

Przerwa kawowa #149. Jak dokonać aktualizacji z Java 8 do Java 17. Różne sposoby iteracji po liście w Javie

Opublikowano w grupie Random-PL

Jak przeprowadzić migrację z Java 8 do Java 17

Źródło: Medium Korzystając z tej publikacji, możesz łatwo dokonać aktualizacji z Java 8 do Java 17. Przerwa kawowa #149.  Jak dokonać aktualizacji z Java 8 do Java 17. Różne sposoby iteracji po liście w Javie - 1 Każde nowe wydanie Java, zwłaszcza jeśli mówimy o wersji z długoterminowym wsparciem (LTS), zapewnia programistom wiele nowych funkcji i funkcji, eliminując wcześniej wykryte błędy i poprawia wydajność. Ale jak dotąd, pomimo tego, że Java 17 została wydana prawie rok temu, najpopularniejszą wersją tego języka jest nadal Java 8. Wiele osób waha się przed aktualizacją, uważając, że nowa wersja Java nie jest w pełni kompatybilna z poprzednimi wersjami, a aktualizacja do niego będzie wymagała dużego wysiłku. Osobiście uważam, że aktualizacja jest konieczna. Używam już Java 17, chociaż miałem pewne problemy z aktualizacją. Ponadto warto wziąć pod uwagę, że Java 8 już dawno przestała być usługą bezpłatną. Wydajność Java 17 jest znacznie lepsza. Na przykład, korzystając z ZGC, nie musisz się już martwić konfiguracją ustawień usuwania śmieci. Jeśli chcesz przeprowadzić migrację z Java 8 do Java 17, będziesz musiał wykonać dodatkową pracę. Ponieważ przeszedłem już tę drogę, mogę podzielić się swoimi doświadczeniami w migracji do nowej wersji.

Zaktualizuj wersję wtyczki kompilatora Maven

Dla niektórych programistów wersja wtyczki kompilatora Maven może być za stara. Jeśli chcesz pracować z Javą 17, wersja wtyczki kompilatora Maven musi wynosić co najmniej 3.5.4.
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>wtyczka-maven-compiler</artifactId> <version>3.8.1</version> <konfiguracja> <source>17</source> <target>17</target> </configuration> </plugin>

Zaktualizuj zależności

Pierwszym krokiem podczas aktualizacji z Java 8 do Java 17 jest aktualizacja zależności. Ponieważ pierwotnie używana zależność prawdopodobnie w ogóle nie obsługuje Java 17, będziesz musiał ją zaktualizować, jeśli chcesz zminimalizować wpływ aktualizacji wersji. W przeciwnym razie możesz napotkać szereg problemów. 1. Na przykład Lombok spowoduje błąd kompilacji. Informacje o błędzie są następujące:
Nie udało się wykonać celu org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (kompilacja domyślna) w projekcie encloud-common: Błąd krytyczny podczas kompilacji: java.lang.ExceptionInInitializerError: Nie można ustawić pola jako prywatnego com.sun .tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs dostępne: moduł jdk.compiler nie „otwiera com.sun.tools.javac.processing” do modułu bez nazwy
Ponieważ Lombok wstrzykuje wygenerowany kod w czasie kompilacji i korzysta z klas z pakietu com.sun.tools.javac.* , musisz zaktualizować Lombok do najnowszej wersji. To rozwiąże problem. 2. Połączenie zookeepera zgłosi błąd UnresolvedAddressException . Informacje o błędzie są następujące:
org.apache.zookeeper.ClientCnxn - Sesja 0x0 dla serwera 10.0.*.*/<unresolved>:2181, nieoczekiwany błąd, zamykanie połączenia z gniazdem i próba ponownego połączenia java.nio.channels.UnresolvedAddressException: null w sun.nio.ch. Net .checkAddress(Net.java:149) ~[?:?] w sun.nio.ch.Net.checkAddress(Net.java:157) ~[?:?] w sun.nio.ch.SocketChannelImpl.checkRemote( SocketChannelImpl .java:816) ~[?:?] w sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:839) ~[?:?] w org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java: 277) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] w org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:287) ~[zookeeper-3.4. 13.słoik:3 .4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03 ] w org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] w org.apache.zookeeper.ClientCnx n$ SendThread.run(ClientCnxn .java:1064) [zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
Przyczyną błędu jest to, że w Javie 15 dokonano refaktoryzacji metody toString dla InetSocketAddressHolder . Jeśli używasz mavena, możesz użyć polecenia mvnversions:display-dependent-updates, aby sprawdzić dostępność aktualizacji zależności. Wynik będzie wyglądał następująco: Przerwa kawowa #149.  Jak dokonać aktualizacji z Java 8 do Java 17. Różne sposoby iteracji po liście w Javie - 2

Dodaj zależność

Jeśli skompilujesz z JAXB, pojawi się błąd. Dzieje się tak, ponieważ JAXB został usunięty z Java 11. Musisz więc dodać pewne zależności JAXB Maven.
<dependentency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependent> <dependenty> <groupId>com.sun.xml .bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0</version> </dependent> < zależność> <groupId>com.sun.xml.bind</groupId> <artifactId> jaxb-impl</artifactId> <version>2.3.0</version> </dependent>
Oprócz tego Java 11 usuwa również moduły Java EE i CORBA, więc będziesz musiał ręcznie dodać pakiety javax.
<dependentency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependent>

Obsługa wyjątku InaccessibleObjectException

Jeśli użyjesz odbicia w swojej aplikacji, szczególnie setAccessible(true) , prawdopodobnie podczas uruchamiania aplikacji pojawi się błąd InaccessibleObjectException . Błąd jest spowodowany modułowym systemem platformy Java, który umożliwia dostęp tylko pod pewnymi warunkami:
  1. Zajęcia muszą być publiczne.
  2. Musisz wyeksportować własne pakiety.
Aby rozwiązać ten błąd, możesz ręcznie ustawić moduł jako publiczny. Aby to zrobić, musisz dodać opcję --add-opens do wiersza poleceń uruchamiania Java, jak pokazano poniżej.
# --add-opens ma następującą składnię: {moduły}/{pakiet}=WSZYSTKIE BEZ NAZWY java --add-opens java.base/java.lang=WSZYSTKIE NIENAZWANE
Możesz też zmienić kod Java, aby ostatecznie rozwiązać ten problem.
module java.base {
    exports java.lang;
}
Ogólnie rzecz biorąc, po rozwiązaniu wszystkich powyższych problemów Twoja aplikacja powinna działać poprawnie w Javie 17. Mam nadzieję, że ten artykuł pomoże Ci w migracji do Javy 17.

Różne sposoby iteracji po liście w Javie

Źródło: Rrtutors W tym artykule poznamy kilka sposobów iteracji po liście w Javie. Przerwa kawowa #149.  Jak dokonać aktualizacji z Java 8 do Java 17. Różne sposoby iteracji po liście w Javie - 3Framework Collection posiada interfejs List, który pozwala nam zachować uporządkowaną kolekcję obiektów. Interfejs List jest implementowany przez ArrayList, LinkedList, Stack i Vector. Znaczna liczba aplikacji Java korzysta z ArrayList i LinkedList. Istnieje kilka sposobów iteracji po liście, a każdy z nich ma swoją własną charakterystykę.

Jak iterować po liście w Javie

Możesz użyć trzech sposobów iteracji listy w Javie:
  • Korzystanie z zaawansowanej metody For Loop.
  • Korzystanie z metody iteratora.
  • Iteruj po elementach forEach.

1. Korzystanie z zaawansowanej metody For Loop.

To jest wersja podstawowej pętli for , której można używać do iteracji po liście. Oto przykład:
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+ " ");
        }
            }
}
Wniosek:
100 200 300 400

2. Stosowanie metody iteratora.

Do iteracji po liście można także używać iteratorów. Iteratory są szczególnie przydatne, gdy trzeba zmodyfikować listę iterowalną. Przykład:
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();
                        }

            }
            }
}
Wniosek:
100 200 300

3. Iteruj po elementach forEach.

Po dodaniu funkcji lambda do Javy w składni języka wprowadzono funkcję forEach, która umożliwia iterację po dowolnej kolekcji. Poniższy przykład kodu pokazuje, jak można użyć metody forEach do iteracji po liście:
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);
            }
}
Wniosek:
1 2 3 4
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION