<compilerArgs>
<arg>--enable-preview</arg>
</compilerArgs>
Car 레코드public record Car(String name) {}
Car를 계산하고 다른 비즈니스 로직을 위해 Car 컬렉션을 반복해야 함for (var car : cars) {
total++;
if (total > limit) {
// side effect
}
}
Car 컬렉션의 모든 요소를 살펴봐야 하지만, 그것을 사용할 필요는 없음for (**var _** : cars) {
total++;
if (total > limit) {
// side effect
}
}
Car가 사용되지 않는다는 것을 분명히 함for문과 함께 사용할 수 있음sendOneTimeNotification()은 한 번만 호출됨ifor (**int i = 0, _** = sendOneTimeNotification(); i < cars.size(); i++) {
// Notify car
}
_ 사용 가능static Car removeThreeCarsAndReturnFirstRemoved(Queue<Car> cars) {
var car = cars.poll();
**var _** = cars.poll();
**var _** = cars.poll();
return car;
}
catch문에서 유용하게 사용됨try {
someOperationThatFails(car);
} catch (**IllegalStateException _**) {
System.out.println("Got an illegal state exception for: " + car.name());
} catch (**RuntimeException _**) {
System.out.println("Got a runtime exception!");
}
catch에서 여러 예외 유형에 대해 작동함catch (**IllegalStateException | NumberFormatException _**) { }
class Transaction implements AutoCloseable {
@Override
public void close() {
System.out.println("Closed!");
}
}
static void obtainTransactionAndUpdateCar(Car car) {
try (**var _ = new Transaction()**) {
updateCar(car);
}
}
try (**var _ = new Transaction(); var _ = new FileInputStream("/some/file")**)
Map 인터페이스의 computeIfAbsent() 메소드Map에 값이 있는지 확인하거나 함수를 기반으로 새로운 값을 계산함static Map<String, List<Car>> getCarsByFirstLetter(List<Car> cars) {
Map<String, List<Car>> carMap = new HashMap<>();
cars.forEach(car ->
carMap.computeIfAbsent(car.name().substring(0, 1), _ -> new ArrayList<>()).add(car)
);
return carMap;
}
map.forEach(**(_, _)** -> System.out.println("Works!"));
abstract class Engine { }
class GasEngine extends Engine { }
class ElectricEngine extends Engine { }
class HybridEngine extends Engine { }
Engine 타입에 따라 재사용할 수 있도록 매개 변수화된 타입을 지원하도록 Car를 확장color라는 새로운 필드 추가public record Car<T extends Engine>(String name, String color, T engine) { }
Car일 때, 그것의 색상을 얻고 싶은 경우static String getObjectsColor(Object object) {
if (object instanceof **Car(String name, String color, Engine engine)**) {
return color;
}
return "No color!";
}
static String getObjectsColorWithUnnamedPattern(Object object) {
if (object instanceof **Car(_, String color, _)**) {
return color;
}
return "No color!";
}
instanceof 정의에도 사용되지만 그닥 유용하지는 않은 경우if (car instanceof **Car<?> _**) { }
switch 패턴으로 해체하면 필드를 무시할 수 있음static String getObjectsColorWithSwitchAndUnnamedPattern(Object object) {
return switch (object) {
case **Car(_, String color, _)** -> color;
default -> "No color!";
};
}
switch문에서 Engine 타입 처리return switch (car) {
case **Car(_, _, GasEngine _)** -> "gas";
case **Car(_, _, ElectricEngine _)** -> "electric";
case **Car(_, _, HybridEngine _)** -> "hybrid";
default -> "none";
};
case를 가드와 페어링하기return switch (car) {
case Car(_, _, GasEngine _), Car(_, _, ElectricEngine _) when someVariable == someValue -> "not hybrid";
case Car(_, _, HybridEngine _) -> "hybrid";
default -> "none";
};
https://www.baeldung.com/java-unnamed-patterns-variables
https://www.inflearn.com/questions/12660/side-effect에-대해서-조금-더-자세히-설명해주실-수-있으신가요