Spis treści

Java 10 - var, nowe metody w Optional, kolekcje "unmodifiable"

Ilustracja - słodkie bułeczki

Nowości w języku

Java 10 wniosła do języka trochę słodkiego smaku. Zmian z pewnością nie należy określać pogardliwym stwierdzeniem “to tylko syntactic sugar!”, ale nie mam wątpliwości, że dotatki są wyjątkowo smaczne - spójrzcie:

Wnioskowanie typów dla zmiennych lokalnych

Od wersji Java 10 możliwe jest deklarowanie zmiennych lokalnych inicjalizowanych w miejscu definicji bez podawania ich typu. Zmienną taką należy zadeklarować poprzedzając ją - zamiast nazwą typu - słówkiem var (ze względu na kompatybilność wsteczną var nie jest słowem kluczowym, lecz zarezerwowaną nazwą typu). Nareszcie!

1
2
var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

Dobra praktyka: używać tam, gdzie nie ma wątpliwości co do typu. Nie należy nakładać na przyszłych maintainerów kodu konieczności sprawdzania np. typu wartości zwracanej przez funkcję; byłoby to dość niegrzecznym nadużyciem:

1
var x = someFunction();

Inne konteksty użycia var to:

  • zmienna indeksująca w standardowej pętli
1
2
3
for (var i = 0; i < count; i++) {
// use i
}
  • zmienna pętli w pętli rozszerzonej
1
2
3
for (var person : people) {
//use person
}
  • zmienne używane w konstrukcji try-with-resources
1
2
3
try(var data = new FileInputStream("my_data.txt)) {
// use data
}

Nowa metody w klasie Optional

Optional otrzymał nowy wariant metody rzucającej wyjątek w przypadku braku wartości; obok orElseThrow(Supplier<Throwable>) została dodana metoda orElseThrow(), która rzuca NoSuchElementException.

Kopiowanie kolekcji

Interfejsy List i Set uzyskały nową metodę copyOf pozwalającą na utworzenie niemodyfikowalnej kolekcji z elementów bieżącej (this) kolekcji.

W przeciwieństwie do kolekcji uzyskanych przez owinięcie kolekcji źródłowej wywołaniem: Collections.unmodifiableList(source) (i podobnymi), które stanowią jedynie widok na kolekcję źródłową i ich zawartość odzwierciedla zmiany w “źródle”, kolekcje skopiowane przy użyciu copyOf() są “oderwane” od kolekcji źródłowej i nie “widzą” zmian w niej dokonanych.

Wykonana kopia jest płytka, więc zmiana elementów znajdujących się w kolekcji jest w dalszym ciągu możliwa. O niemodyfikowalnych kolekcjach i widokach można przeczytać w API dla interfejsu Collection.

Java - inne wpisy

Może Cię również zainteresować: