[내배캠 Spring TIL] Java Stream 썸네일

[내배캠 Spring TIL] Java Stream

Java
Stream
2024년 7월 22일

자바 공부를 하며 배운 Stream에 대한 내용을 정리해보겠다.

Stream #

Stream은 배열, 컬렉션을 간결하게 처리하게 할 수 있는 기술이다. filter(), map(), sort() 등을 활용해 데이터를 가공할 수 있고, reduce(), match()등을 활용해 배열의 값으로 연산을 해 결과를 만들수도 있다.

String[] arr = {"h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!"};

String[] newArrayByForEach = {};
for (String a : arr) {
    if (a.equals(" ")) {
        continue;
    }
    String[] temp = new String[newArrayByForEach.length + 1];
    for (int i = 0; i < newArrayByForEach.length; i++) {
        temp[i] = newArrayByForEach[i];
    }
    temp[temp.length - 1] = a;
    newArrayByForEach = temp;
}
String[] arr = {"h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!"};
String[] newArrayByStream = Arrays.stream(arr).filter(v -> !v.equals(" ")).toArray(String[]::new);

위의 예제 코드는 String[] arr에서 공백 문자를 제거한 문자열 배열을 생성하는 코드이다. 첫번째 코드는 Stream을 사용하지 않고 구현했고, 두번째는 사용하였다.

코드 가독성과 편의성 측면에서 Stream이 훨씬 뛰어난 것을 볼 수 있다.

함수형 인터페이스 #

Stream의 메소드는 함수형 인터페이스를 파라미터로 받는다. 함수형 인터페이스는 추상 메소드가 하나만 존재하는 인터페이스를 의미한다.

@FunctionalInterface
public interface FuncInterface {
    abstract int get();
}

위 인터페이스는 int get()이라는 추상 메소드 하나만 존재한다. 따라서 함수형 인터페이스라고 볼 수 있다. @FunctionalInterface 어노테이션을 추가해 함수형 인터페이스라는 것을 명시할 수도 있다.

@FunctionalInterface를 추가할 경우 인터페이스에 다른 추상 메소드를 추가하려 하면 오류가 발생한다.

Lambda #

함수형 인터페이스는 람다식으로 구현이 가능하다.

기본 람다식은 () -> {} 모양으로 자바스크립트의 화살표 함수와 모양이 비슷하다.

// 람다를 사용하지 않음
String[] newArrayByStream2 = Arrays.stream(arr).filter(new Predicate<String>() {
            @Override
            public boolean test(String v) {
                return !v.equals(" ");
            }
        }).toArray(String[]::new);

// 람다를 사용함
String[] newArrayByStream1 = Arrays.stream(arr).filter(v -> !v.equals(" ")).toArray(String[]::new);

위 예제 코드를 보면 긴 익명 객체를 생성하는 코드가 람다를 사용하여 짧게 표현 가능한 것을 확인할 수 있다.


최근 게시물

김진근 • © 2025