4. 응용 변형 예제
변형 1: 스트림 중간 결과를 지역 record 로
record NameAmount(String name, BigDecimal amount) {}
var top = orders.stream()
.map(o -> new NameAmount(o.customer(), o.amount()))
.sorted(Comparator.comparing(NameAmount::amount).reversed())
.limit(3).toList();Map.Entry 나 Object[] 로 짝을 나르던 코드가 이름 있는 타입이 됩니다. 메서드 밖에서 쓸 일이 없으면 지역 record 로 충분합니다.
변형 2: API 응답을 sealed 로 표현
sealed interface ApiResult<T> permits Ok, Fail {}
record Ok<T>(T data) implements ApiResult<T> {}
record Fail<T>(int status, String message) implements ApiResult<T> {}
String render(ApiResult<User> r) {
return switch (r) {
case Ok<User>(User u) -> "환영합니다, " + u.name();
case Fail<User>(int s, String m) when s == 401 -> "다시 로그인하세요";
case Fail<User>(int s, String m) -> "오류 " + s + ": " + m;
};
}예외 대신 결과 타입으로 실패를 표현하면, 호출자가 실패 처리를 빠뜨릴 수 없습니다. 제네릭 record 도 해체 패턴이 됩니다.
변형 3: 텍스트 블록으로 JSON 테스트 데이터
String body = """
{
"orderNo": %d,
"items": [{"code": "A1", "qty": 2}]
}
""".formatted(1001);테스트 코드의 요청 본문, MyBatis 동적 SQL 조각, 이메일 템플릿이 텍스트 블록의 자리입니다. 값 주입은 신뢰할 수 있는 값에만 씁니다.
변형 4: instanceof 패턴으로 equals 줄이기
@Override public boolean equals(Object o) {
return o instanceof Member m && id == m.id; // 검사·캐스팅·비교가 한 줄
}중급 07 의 세 줄짜리 equals 가 한 줄이 됩니다. instanceof 가 false 면 && 뒤를 평가하지 않으므로 null 도 안전합니다.