자바 컬렉션 API란?
자바에서 데이터 목록을 다루는 클래스를 말한다.
배열과 다르게 하나의 컬렉션에 서로 다른 데이터형이 저장 가능하다.
List
- 순서가 있음, 인덱스 값으로 활용 가능
Set
- 데이터의 저장 순서가 없기 때문에 중복 저장 불가능(중복 요소 제거됨)
- 저장된 위치를 알 수 없기 때문에 위치값으로 데이터 얻을 수 없다.
private final List<String> menuItems;
public Menu(final List<String> menuItems) {
// TODO: Collection API를 사용하여 코드를 재사용하고 의도를 파악하기 쉽게 만들어보세요.
for (int i = 0; i < menuItems.size(); i++) {
for (int j = 0; j < i; j++) {
if (menuItems.get(i).equals(menuItems.get(j))) {
throw new IllegalArgumentException("중복된 메뉴가 있습니다.");
}
}
}
this.menuItems = menuItems;
}
코드 Collection API 사용해서 바꾸기
public Menu(final List<String> menuItems){
Set<String> uniqueMenuItems=new HashSet<>(menuItems);
if(uniqueMenuItems.size()!=menuItems.size()){
throw new IllegalArgumentException("중복된 메뉴가 있습니다.");
}
this.menuItems=menuItems;
}
Set 사용: menuItems 리스트를 HashSet으로 변환하면 중복된 항목이 자동으로 제거된다.
public Menu(final List<String> menuItems) {
if (menuItems.size() != menuItems.stream().distinct().count()) {
throw new IllegalArgumentException("중복된 메뉴가 있습니다.");
}
this.menuItems = menuItems;
}
Stream 클래스에서 제공하는 distinct() 메서드 이용
- 중복 요소가 없는 고유한 요소로 구성된 새로운 Stream를 반환한다.
- 중복된 요소가 존재하는 경우 첫 번째 위치의 요소를 반환하므로 정렬 순서를 보장한다.
Integer averagePosition() {
final OptionalDouble average = participants.stream()
.mapToInt(Car::position)
.average();
if (average.isEmpty()) {
// Note: null은 버그를 유발할 수 있다.
return null;
}
return (int) average.getAsDouble();
}
null을 사용하면 NullPointerException이 발생할 수 있고, null로 인해 생길 수 있는 부작용이 발생할 수 있다.
null을 사용하지 않고 의도를 전달하는 방법은 무엇일까?
Optional<Integer> averagePosition() {
final OptionalDouble average = participants.stream()
.mapToInt(Car::position)
.average();
if (average.isEmpty()) {
return Optional.empty();
}
return Optional.of((int) average.getAsDouble());
}
Optional을 사용한다!
객체를 감싸는 컨테이너 역할을 한다.
⭐️ 주의점
값의 존재 여부를 판단하지 않고 접근한다면 NoSuchElementException 가 발생한다.
int averagePosition() {
final OptionalDouble average = participants.stream()
.mapToInt(Car::position)
.average();
if (average.isEmpty()) {
throw new IllegalStateException("게임 참여자가 없습니다.");
}
return (int) average.getAsDouble();
}
내부에서 예외처리 해주는 방법도 가능하다.
상황에 따라 적절하게 사용해야 한다.
'study' 카테고리의 다른 글
| [초록스터디] JUnit5 테스트 코드 작성법 공부 (1) | 2024.05.10 |
|---|