java-common-code/docs/java_construction.md
2025-10-11 18:09:02 +09:00

223 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Java SE構文8〜21の主要差分まとめ
この文書は、Java SE 8から21までに追加・変更された主要な言語仕様とAPIをまとめたものです。
バージョン間の差分を理解することで、最新のJavaコードを正しく書き分けることができます。
---
## Java 82014年
**モダン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 92017年
**モジュール化と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 102018年
**ローカル変数型推論**
- **var キーワード**
```java
var list = new ArrayList<String>();
```
コンパイル時に型を推論。ただしローカル変数限定。
---
## Java 112018年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〜152019〜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 162021年
**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 172021年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〜202022〜2023年
**テスト的・プレビュー的な改良**
- **Simple Web Server**
```bash
jwebserver -p 8080
```
簡易HTTPサーバを起動できる。
- **Recordパターンプレビュー**
```java
if (p instanceof Point(int x, int y)) { ... }
```
---
## Java 212023年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 |
この流れを理解しておくと、古いコードと新しいコードの混在環境でもスムーズに対応できる。