チケット集計をStreamで書き直す
## ストーリー
TicketCraftのチケット一覧処理は、これまでずっとfor文と匿名クラスで書かれてきました。今回、次の3つの集計処理が必要になりました。
1. 未対応(`open`)かつ高優先度(`high`)のバグチケットだけを、期限が近い順に並べる
2. 対応中(`open`)のチケット件数を数える
3. すべてのチケットに担当者が割り当たっているかを判定する
記事「[ラムダ式とStream API入門](https://nanade.net/blog/java8-lambda-stream/)」で学んだ`filter`・`sorted`・`count`・`allMatch`を使って、`TicketQueries`クラスの3つのメソッドを実装してください。
## 課題
雛形の`TicketQueries`クラスにある3つのstaticメソッドを実装してください(`Ticket`・`BugTicket`クラスは変更不要です)。
1. `highPriorityOpenBugsSortedByDueDate(List<Ticket> allTickets)`: `BugTicket`のうち`status`が`"open"`かつ`severity`が`"high"`のものだけを、`dueDate`が近い順に並べた`List<BugTicket>`を返す
2. `countOpenTickets(List<Ticket> allTickets)`: `status`が`"open"`のチケットの件数を返す
3. `allAssigned(List<Ticket> allTickets)`: すべてのチケットに`assignee`(`null`でない担当者)が設定されていれば`true`を返す
実装方法は問いません(Stream APIでもfor文でも、結果が正しければ合格です)が、記事の趣旨に沿ってStream APIでの実装に挑戦してみてください。
**注意**: `status`や`severity`が`null`のチケットが混ざっていても例外を起こさないようにしてください。`ticket.getStatus().equals("open")`のように呼び出し側から比較すると、`status`が`null`のときに`NullPointerException`が発生します。`"open".equals(ticket.getStatus())`のように向きを変えて書くとnull安全になります。
## 手順
1. **Step 1**: `allTickets.stream()`から始めて、`instanceof BugTicket`で絞り込み、`(BugTicket)`にキャスト(`map`)、`status`と`severity`で絞り込み(`filter`)、`dueDate`順に並べ(`sorted`)、`collect(Collectors.toList())`でリスト化する
2. **Step 2**: `allTickets.stream()`から`filter`で`status`が`"open"`のものだけに絞り込み、`count()`で件数を数える
3. **Step 3**: `allTickets.stream()`から`allMatch`で「`getAssignee() != null`」をすべての要素が満たすか判定する
## 期待される実行結果の例
```java
List<Ticket> tickets = List.of(
new BugTicket(1, "ログインエラー", "open", LocalDate.of(2026, 8, 10), "high"),
new BugTicket(2, "表示崩れ", "open", LocalDate.of(2026, 8, 5), "low"),
new BugTicket(3, "決済失敗", "open", LocalDate.of(2026, 8, 1), "high")
);
TicketQueries.highPriorityOpenBugsSortedByDueDate(tickets);
// => [決済失敗(8/1), ログインエラー(8/10)](表示崩れはseverityがlowなので除外)
TicketQueries.countOpenTickets(tickets); // => 3
TicketQueries.allAssigned(tickets); // => false(誰も担当者が設定されていない)
```
提出すると、この記事と同じ観点の隠しテスト(合計8件)で自動採点されます。全件通過で合格です。