223 lines
5.4 KiB
Markdown
223 lines
5.4 KiB
Markdown
# Java SE構文(8〜21の主要差分まとめ)
|
||
|
||
この文書は、Java SE 8から21までに追加・変更された主要な言語仕様とAPIをまとめたものです。
|
||
バージョン間の差分を理解することで、最新のJavaコードを正しく書き分けることができます。
|
||
|
||
---
|
||
|
||
## Java 8(2014年)
|
||
**モダンJavaの基礎となるアップデート**
|
||
|
||
- **ラムダ式**
|
||
```java
|
||
list.forEach(x -> System.out.println(x));
|
||
```
|
||
匿名クラスを簡潔に書ける。
|
||
|
||
- **Stream API**
|
||
```java
|
||
list.stream().filter(x -> x > 10).map(x -> x * 2).toList();
|
||
```
|
||
コレクションを関数的に操作可能。
|
||
|
||
- **Optional<T>**
|
||
```java
|
||
Optional.ofNullable(value).orElse("default");
|
||
```
|
||
Null安全のためのラッパー型。
|
||
|
||
- **Date and Time API (java.time)**
|
||
```java
|
||
LocalDate.now(); Instant.now();
|
||
```
|
||
新しい日付時刻API(旧java.util.Dateの置換)。
|
||
|
||
- **Defaultメソッド(interface)**
|
||
```java
|
||
interface A {
|
||
default void log() { System.out.println("log"); }
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Java 9(2017年)
|
||
**モジュール化とAPI整備**
|
||
|
||
- **モジュールシステム(Project Jigsaw)**
|
||
```java
|
||
module com.example.app {
|
||
requires java.sql;
|
||
exports com.example.app;
|
||
}
|
||
```
|
||
大規模プロジェクト向け依存管理。
|
||
|
||
- **try-with-resources改良**
|
||
```java
|
||
try (var br = Files.newBufferedReader(path)) {
|
||
...
|
||
}
|
||
```
|
||
既存変数もtryリソースとして扱える。
|
||
|
||
- **Stream API追加メソッド**
|
||
`takeWhile`, `dropWhile`, `iterate`(predicate付き)
|
||
|
||
- **`var` はまだ導入されていない(Java 10以降)**
|
||
|
||
---
|
||
|
||
## Java 10(2018年)
|
||
**ローカル変数型推論**
|
||
|
||
- **var キーワード**
|
||
```java
|
||
var list = new ArrayList<String>();
|
||
```
|
||
コンパイル時に型を推論。ただしローカル変数限定。
|
||
|
||
---
|
||
|
||
## Java 11(2018年LTS)
|
||
**安定版LTS・実用性の向上**
|
||
|
||
- **新HTTPクライアント(java.net.http)**
|
||
```java
|
||
HttpClient.newHttpClient()
|
||
.send(HttpRequest.newBuilder(URI.create("https://example.com")).build(),
|
||
HttpResponse.BodyHandlers.ofString());
|
||
```
|
||
|
||
- **文字列ユーティリティ**
|
||
- `" text ".strip()`
|
||
- `"a\nb\n".lines()`
|
||
- `"abc".repeat(3)`
|
||
|
||
- **ファイル読み書きの簡略化**
|
||
```java
|
||
String s = Files.readString(Path.of("a.txt"));
|
||
```
|
||
|
||
- **var in lambda**
|
||
```java
|
||
(var x, var y) -> x + y
|
||
```
|
||
|
||
---
|
||
|
||
## Java 12〜15(2019〜2020年)
|
||
**構文改善と新機能の試験導入**
|
||
|
||
- **switch式(Java 14で正式導入)**
|
||
```java
|
||
int num = switch (day) {
|
||
case MON, TUE -> 1;
|
||
default -> 0;
|
||
};
|
||
```
|
||
|
||
- **テキストブロック(Java 15)**
|
||
```java
|
||
String json = """
|
||
{
|
||
"id": 1,
|
||
"name": "test"
|
||
}
|
||
""";
|
||
```
|
||
|
||
---
|
||
|
||
## Java 16(2021年)
|
||
**record と sealed の前段階**
|
||
|
||
- **recordクラス(データ専用クラス)**
|
||
```java
|
||
public record Point(int x, int y) {}
|
||
Point p = new Point(1, 2);
|
||
```
|
||
|
||
- **Stream.toList()**
|
||
Java 8までは `collect(Collectors.toList())` が必要だった。
|
||
|
||
---
|
||
|
||
## Java 17(2021年LTS)
|
||
**構造的な制約とパターンマッチング**
|
||
|
||
- **sealedクラス**
|
||
```java
|
||
public sealed class Shape permits Circle, Square {}
|
||
public final class Circle extends Shape {}
|
||
```
|
||
|
||
- **instanceofパターンマッチング**
|
||
```java
|
||
if (obj instanceof String s) {
|
||
System.out.println(s.length());
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Java 18〜20(2022〜2023年)
|
||
**テスト的・プレビュー的な改良**
|
||
|
||
- **Simple Web Server**
|
||
```bash
|
||
jwebserver -p 8080
|
||
```
|
||
簡易HTTPサーバを起動できる。
|
||
|
||
- **Recordパターン(プレビュー)**
|
||
```java
|
||
if (p instanceof Point(int x, int y)) { ... }
|
||
```
|
||
|
||
---
|
||
|
||
## Java 21(2023年LTS)
|
||
**軽量スレッド(Virtual Thread)とパターンマッチの完成形**
|
||
|
||
- **Virtual Thread**
|
||
```java
|
||
Thread.startVirtualThread(() -> System.out.println("Hello"));
|
||
```
|
||
数百万スレッドを軽量に扱える。
|
||
|
||
- **Pattern Matching for switch**
|
||
```java
|
||
static String format(Object o) {
|
||
return switch (o) {
|
||
case Integer i -> "int " + i;
|
||
case String s -> "str " + s;
|
||
default -> "unknown";
|
||
};
|
||
}
|
||
```
|
||
|
||
- **Record Pattern正式採用**
|
||
```java
|
||
record Point(int x, int y) {}
|
||
if (obj instanceof Point(int x, int y)) { ... }
|
||
```
|
||
|
||
---
|
||
|
||
## まとめ
|
||
|
||
| バージョン | 主な特徴 |
|
||
| ---------- | ------------------------------------------- |
|
||
| 8 | Lambda, Stream, Optional, 新Date/Time |
|
||
| 9 | Module System |
|
||
| 10 | var(型推論) |
|
||
| 11 | 新HTTP, String/Files改善 |
|
||
| 14 | switch式 |
|
||
| 15 | テキストブロック |
|
||
| 16 | record |
|
||
| 17 | sealed, instanceof pattern |
|
||
| 21 | virtual thread, pattern matching for switch |
|
||
|
||
この流れを理解しておくと、古いコードと新しいコードの混在環境でもスムーズに対応できる。
|