2022년 3월 24일 TIL

yshjft·2022년 3월 24일
0

데브코스 TIL

목록 보기
4/45

Collection 이야기

1. Collection

  • 데이터의 묶음
Collection
     |
     |---List (Collection의 구현체)
     |    |---LinkedList (List의 구현체)
     |    |---ArrayList (List의 구현체)
     |    |---Vector (List의 구현체)
     |    |---Stack (List의 구현체)
     |
     |---Set (Collection의 구현체)
          |---HashSet (Set의 구현체)
  • Collection에서 함수형 인터페이스를 사용하여 고정된 기능이 아니라 사용하는 측에서 기능을 정의할 수 있다. 이는 데이터 자체는 수정하지 않으면서 사용자가 원하는데로 활용할 수 있도록 해준다. 아래와 같이 함수를 연속적으로 사용하는 것을 메소드 체이닝이라고 한다.
int s = new MyCollection<>(Arrays.asList("A", "CA", "DSB", "ASDC", "ASDFE"))
  .map(s1 -> s1.length())
  .filter(i -> i % 2 == 1)
  .size();
  • 추가적으로 알게된 내용
    U는 해당 메서드에서만 유효한 제너릭 타입이 된다.
public <U> MyCollection<U> map(Function<T, U> function) {...}   

2. Iterator

  • 데이터의 묶음을 풀어서 하나씩 처리할 수 있는 수단을 제공
MyIterator<String> iter =
                new MyCollection<>(Arrays.asList("A", "CA", "DSB", "ASDC", "ASDFE")).iterator();

while(iter.hasNext()) {
    String s = iter.next();
    ...
}
  • next() 를 통해서 다음 데이터를 조회
    • 조회할 데이터가 없으면 exception이 발생
  • hasNext() 를 통해 데이터가 남아 있는지 확인

3. Stream

  • 데이터의 연속

  • System.in / System.out 이것도 스트림

  • map, filter, forEach 제공

    • 고차함수, 함수를 인자로 받는다(함수형 인터페이스)
  • Collection to Stream & Array to Stream

    • Collection → Stream
      • Collections.stream() 을 제공 (Java8)
    • Array → Stream
      • primitive type은 제너릭을 지원하지 않기 때문에 primitive type을 위한 Stream을 제공한다.
      • ex) IntStream, LongStream 등
      • Arrays.stream()은 primitive type을 위한 Stream을 반환
  • Stream to Collection & Stream to Array

    • Stream → Collection
      • collect(Collectors.toList())
    • Stream → Array
      • toArray()
      • 타입을 지정하지 않으면 Object가 타입으로 설정된다
  • Stream 생성

    • Stream.generate()
    Stream.generate(r::nextInt)
            .limit(10)
            .forEach(System.out::println);
    • Stream.iterate()
    // seed: 초기값
    // 0, 2, 4, 6 ...
    Stream.iterate(0, (i) -> i + 2)
            .limit(10)
            .forEach(System.out::println);
  • 스트림을 사용하면 연속된 데이터에 대해서 풍부한 고차함수들을 사용하여 강력한 기능을 간결하게 표현할 수 있다!

3. Optional

  • NPE

    • Null Pointer Exception
    • 가장 많이 발생하는 에러중의 하나
  • 이제부터 null을 쓰지 않는 것을 약손하자!

    • EMPTY 객체를 이용
    User user2 = getUser();
    if(user2 == User.EMPTY) {...}
    • Optional 사용
  • Optional

    • 프로그램을 좀 더 안전하게 만들 수 있게 되었다.
    • .of(value)
      null이 아닌 객체를 담고 있는 Optional 객체를 생성한다.
    • .empty()
      null인 객체를 담는 Optional 객체를 생성한다.
    • 확인하는 방법들: .isEmpty(), isPresent(), ifPresentOrElse(), ifPresent()
    if (optionalUser.isPresent()) {
      /// do 1
    } else {
      //// do 2
    }
    
    if (optionalUser.isEmpty()) {
        // do 2
    } else {
        // do 1
    }
    
    optionalUser.ifPresentOrElse(user -> {
        // do 1, not null
    }, () -> {
        // do 2, null
    });
    
    optionalUser.ifPresent(user -> {
        // do 1
    });
profile
꾸준히 나아가자 🐢

0개의 댓글