Giken Dev
반응형

실무에서 자주 발생하는 상황에 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 문 보다 느린가?

경우에 따라 다르지만, 대체로 느릴 수 있다. 체감할 수 있는 정도는 아니다.

가독성 우선하여 개발 후 성능이 필요한 경우 튜닝하자.

 

 

 

 

 

반응형
profile

Giken Dev

@기켄

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!