[초록스터디] 자바 컬렉션 API, Optional

2024. 7. 8. 01:35·study

자바 컬렉션 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
'study' 카테고리의 다른 글
  • [초록스터디] JUnit5 테스트 코드 작성법 공부
zioni
zioni
  • zioni
    jiwon's dev.log
    zioni
  • 전체
    오늘
    어제
    • 분류 전체보기 (76)
      • spring & java (13)
      • Algorithm (14)
      • PS (37)
      • project (3)
      • experience (1)
      • etc (6)
      • study (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    백준2525
    자바
    백준
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
zioni
[초록스터디] 자바 컬렉션 API, Optional
상단으로

티스토리툴바