티스토리 뷰

1. takeWhile()

takeWhile은 인자 값이 false라면 스트림을 중단하는 중간 연산자이다. 쉽게 생각하면 for문을 돌릴 때 break를 거는 것과 비슷하다. 

이 연산자는 아래와 같이 많이 쓰인다.

 

.takeWhile(Objects::nonNull)

 

Objects.nonNull()은 인자값이 null이 아니면 true를 반환해준다. 예시를 들어서 아래 코드가 있다고 가정해보자. 

 

users.stream()
  .takeWhile(Objects::nonNull)

 

users는 List<User> 필드변수다. users를 돌면서 User 객체가 null이 아니면 돌다가, User 객체가 null인 순간 Objects.nonNull()에서 false를 리턴하고, false를 받은 takeWhile은 Stream을 중단시키는 것이다. 

 

2. thenComparing

이것은 Stream API 연산자는 아니지만 정렬할 때 쓰기 좋다. 이름에서 알 수 있듯이 A를 정렬했을 때, A가 똑같다면 이렇게 해라 라는 뜻이다. 예시를 들어보겠다. 

 

.sorted(Comparator.comparing(User::getScore).reversed().thenComparing(User::getName))

 

먼저 사용자의 점수로 내림차순 정렬을 한다. 근데 만약 점수가 같은 사용자가 있다면, 그 사용자들은 이름순으로 다시 정렬한다. 

 

3. orElseGet

orElseGet은 앞에 했던 값이 null일때 실행되는 연산자이다. orElse랑 다른 점은 orElse는 null이 아니어도 실행된다는 점이다. 예시를 들어보겠다. 아래 코드는 User중에 이름이 똑같은 User를 찾는 코드이다. 

 

 return users.stream()
                .filter(user -> user.getName().equals(name))
                .findAny()
                .orElseGet(() -> {
                    User user = createUser(name);
                    users.add(user);
                    return user;
                });

 

좀 더 자세히 보면, 만약 이름이 같은 User가 없다면 orElseGet()을 이용해 새로 생성해준다. 만약 여기서 orElse를 사용한다면, 같은 이름의 User가 있어도 같은 이름으로 또 생성하는 것이다. 그럼 안된다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday