반응형
실무에서 자주 발생하는 상황에 stream API와 Optional 적용하기
백엔드 실무에서 자주 발생하는 일
- 데이터에서 데이터를 조회한다.
- 특정한 조건을 만족하는 데이터가 있는가?
- 없다 -> 예외 발생!
- 있다 -> 다음 작업 실행
for + if로 처리하기 vs stream API + Optional로 처리하기
list 에서 1234 를 찾는 과정을 살펴보겠다.
for + if로 처리하기
public class ForAndIfFilterExampleMain { public static void main(String[] args) { int[] integerArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; List<Integer> integerList = Arrays.stream(integerArray) .boxed() .toList(); Integer findNumber = null; for (int i = 0; i < integerList.size(); i++) { if(integerList.get(i).equals(1234)) { findNumber = integerList.get(i); break; } } if(findNumber == null) throw new RuntimeException(); System.out.println("findNumber=" + findNumber); } }
stream API + Optional로 처리하기
public class FilterExampleMain { public static void main(String[] args) { int[] integerArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; List<Integer> integerList = Arrays.stream(integerArray) .boxed() .toList(); Integer findNumber = integerList.stream() .filter(integer -> { if(integer.equals(1234)) return true; return false; }) .findAny() .orElseThrow(); System.out.println("findNumber=" + findNumber); } }
stream API + Optional로 처리할 때 코드의 가독성이 더 좋지 않은가.
아이디 중복 검사에 활용하기
public class User { private String id; private String name; public User(String id, String name) { this.id = id; this.name = name; } public boolean sameId(String idToFind) { return this.id.equals(idToFind); } }
public class FindByLevelMain { public static void main(String[] args) { String idToFind = "programmers_user1"; List<User> list = new ArrayList<>(); list.add(new User("programmers_user1", "이준형")); list.add(new User("programmers_user2", "푸")); list.add(new User("programmers_user3", "foo")); list.stream() .filter(user -> user.sameId(idToFind)) .findAny() .ifPresentOrElse(user -> { throw new RuntimeException(idToFind + "는 이미 존재하는 아이디입니다."); }, () -> { System.out.println(idToFind + "는 사용할 수 있는 아이디입니다."); }); } }
보통 데이터가 없는 경우에 예외를 던지는 경우가 많다.
하지만 위 코드에서는 데이터가 있는 경우 데이터를 던지고 있다. 왜냐면 중복 검사이니까!
로직에 따라서 적절히 예외를 던지도록 하자.
stream API 는 for 문 보다 느린가?
경우에 따라 다르지만, 대체로 느릴 수 있다. 체감할 수 있는 정도는 아니다.
가독성 우선하여 개발 후 성능이 필요한 경우 튜닝하자.
반응형
'Programming Language > Java' 카테고리의 다른 글
[Java] 객체 지향 프로그래밍의 5가지 기본 원칙 SOLID 를 예제와 함께 알아 보자. (1) (0) | 2023.09.27 |
---|---|
[Java] 의존 관계에 대해 예제와 함께 알아보자. (0) | 2023.09.26 |
[Java] stream API를 예제와 함께 알아보자. (0) | 2023.09.26 |
[Java] if문이 너무 많다면, 리팩토링을 해보자. (0) | 2023.09.25 |
[Java] Optional - nullPointException을 잘 다뤄보자. (0) | 2023.09.25 |