[내배캠 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);
위 예제 코드를 보면 긴 익명 객체를 생성하는 코드가 람다를 사용하여 짧게 표현 가능한 것을 확인할 수 있다.