[Java] Stream API와 Optional

양성욱·2023년 10월 4일
0
post-thumbnail

이 글은 프로그래머스 - 실무 자바 개발을 위한 OOP와 핵심 디자인 패턴 강의를 정리한 내용입니다.

Stream API는 자바에서 제공하는 강력한 문법으로, Optional과 함께 사용하면 코드의 가독성을 매우 크게 높여줍니다.

실무에서 자주 발생하는 상황에 Stream API와 Optional 적용하기

실무에서 웹 애플리케이션을 개발하다보면 굉장히 자주 발생하는 패턴이있습니다.

바로 위와 같이 DB에서 특정 데이터를 검색하는 경우입니다.

예제를 간략화하기 위해 위와 같이 1 ~ 10의 정수를 포함하고 있는 List에서 특정 값을 조회하고, 결과에 따라 작업을 처리하는 예시를 들어 코드를 작성해보겠습니다.

if & for문을 활용해서 작성한 코드

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);

위 코드는 if & for문을 사용해서 작성한 예시입니다. 이제 위 코드를 Stream API와 Optional을 활용해서 개선해보겠습니다.

Stream API & Optional을 활용해서 작성한 코드

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);

if & for문 대신 Stream API의 filter() 메서드를 활용해서 요소를 반복하다 조건에 맞는 요소를 찾으면, findAny() 메서드로 즉시 반환합니다. 만약 조건에 맞는 요소가 없다면 비어있는 Optional 객체를 반환합니다.

if & for문을 활용한 예제보다 Stream API와 Optional을 활용한 예제가 훨씬 가독성이 높은 걸 확인할 수 있습니다.

좀 더 실전적인 예제

이번에는 좀 더 실전적인 케이스를 예시로 살펴보겠습니다.

웹 서비스에서 흔히 볼 수 있는 회원가입 화면입니다. 가입할 아이디를 입력할 때 이미 사용중인 아이디를 입력한다면 예외 메세지를 사용자에게 전달하는 아이디 중복 검사 기능을 구현한다고 예시를 들어보겠습니다.

User Class

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);
    }
}

사용자를 표현하는 User 클래스입니다. 필드로 idname을 가지고 있고, 입력받은 id 값에 대해 자신의 id와 일치하는지 여부를 조회하는 sameId 메서드를 포함합니다.

사용자 ID 중복 검사 코드

String idToFind = "edgar1";

List<User> list = new ArrayList<>();

list.add(new User("edgar1", "양성욱"));
list.add(new User("edgar2", "음성욱"));
list.add(new User("edgar3", "중성욱"));

list.stream()
    .filter(user -> user.sameId(idToFind))
    .findAny()
    .ifPresentOrElse(user -> {
    	throw new RuntimeException(idToFind + "는 이미 존재하는 아이디입니다.");
    }, () -> {
    	System.out.println(idToFind + "는 사용할 수 있는 아이디입니다.");
	});

User 클래스를 활용해서 주어진 id에 대한 중복 검사를 실시하는 로직입니다. 만약 중복되는 id가 존재하면 예외를 발생시킵니다.

이처럼 Stream API와 Optional을 잘 활용하면 가독성 높은 코드를 작성할 수 있습니다.

profile
개발의 신이시여... 제게 집중할 수 있는 ㅎ... 네? 맥주요?

0개의 댓글