- Java Functional하게 사용하기 - 22022년 02월 07일 22시 08분 23초에 업로드 된 글입니다.작성자: jCurve728x90반응형
Stream
Colletion 형태로 구성된 데이터를 람다를 이용해 간결하고 직관적으로 프로세스하게 해준다.
Stream을 사용해 기존의 반복문을 간결한 형태로 표현 가능하고 병렬 처리를 쉽게 할 수 있다.
Stream이을 사용해 Data를 흐름의 형태로 처리한다고 생각했을 때
이 흐름을 처음, 중간, 끝으로 볼 수 있는데 각각
- source를 stream으로 흐르게 하는 처음
- filter, map 등의 intermediate operations (중간 처리)
- collect, reduce 등의 terminal operation (종결 처리)
으로 볼 수 있다.
우선 중간 처리에서 자주 사용하는 filter와 map을 보자면
filter는 predicate이 true를 반환하는 데이터만 존재하는 stream을 리턴해줍니다.
이 처럼 stream의 데이터가 양수인 값의 stream을 반환하고 list로 collect하는 연산을 간결하게 표현할 수 있습니다.
map은 데이터를 변형하는데 사용하는데 데이터에 Function을 적용한 결과를 제공하는 stream을 리턴해줍니다.
이 처럼 데이터를 받아 *2, 문자열 등의 연산을 진행하고 stream으로 반환하여 list로 collect하는 연산을 간결하게 표현할 수 있습니다.
이러한 중간 처리는 연속해서 method chain 방식으로 연결하여 사용 가능합니다.
다음은 Sorted 입니다.
Sorted는 필요시 Comparator를 받아서 데이터를 정렬하는 stream 중간 처리 함수로 아래와 같이 사용됩니다.
중복되는 데이터를 제거해주는 distinct() 메서드를 활용해서 중복 데이터를 제거한 stream을 받아 collect 해보겠습니다.
주문 list를 stream으로 만들어 메서드 레퍼런스로 사용자의 ID만 골라 담은 stream에서 중복되는 데이터를 제거 후 정렬하여 stream의 데이터를 list로 collect하는 로직입니다.
다음은 flatMap인데 flatMap은 단어 의미에서 유추할 수 있듯 중첩 stream을 하나의 stream으로 flat하게 만들어 리턴해주는 함수 입니다.
cities라는 2차원 배열을 stream으로 만들면 Stream<String[]> 이 되는데 이는 또 stream을 map으로 각각의 데이터를 stream으로 만들어주면 Stream<Stream<String>>이 됩니다.
하지만 저희가 원하는 것은 Stream<String> 이므로 flatMap을 활용해야 합니다.
flatMap을 통해 2 차원 배열을 Stream<String>으로 flat하게 눌러 하나의 stream으로 담아 flattenedCityStream을 만들어 다시 list로 collect를 하는 로직입니다.
이러한 중간 처리 메서드를 사용하여 가독성 높은 간결한 코드로 의미를 쉽게 표현하여 Stream을 처리할 수 있습니다.
코드 작성시 stream과 람다를 사용한 방식을 적절히 사용한다면 더 좋겠다는 느낌이 오죠?
그럼 다음에는 종결 처리 메서드 관련 글을 작성하기 전에 Optional을 정리하도록 하겠습니다~
반응형'JAVA' 카테고리의 다른 글
Java Functional하게 사용하기 - 4 (0) 2022.02.17 Java Functional하게 사용하기 - 3 (0) 2022.02.12 Java Functional하게 사용하기 - 1 (0) 2022.02.03 private method test 기능을 테스트할까? 구현을 테스트할까? (0) 2021.07.12 Iterator 정리 (0) 2021.05.15 댓글