티스토리 뷰

이번장에는 JAVA 8 부터 제공해주는 스트림과 함수형 인터페이스에 대해 알아보자.

스트림
JAVA 8부터 추가되었으며 Collection의 저장요소를 순회하면서 각 요소들에 대한 필터, 연산, 그룹핑 등의 작업을 해주는 기능이며 람다표현식으로도 처리를 할 수 있다.
스트림이 나오기 전에는 Collection객체를 처리할때 코드가 많아지고 가독성이 좋지않았다. 아래 예제코드를 한번보자

스트림 이전코드

스트림 없이 List를 순회하면서 문자열 'A'가 존재하는 요소들만 따로 List로 얻고싶다면 직접 for문을 돌려서
요소들 하나씩 체크하여 또다른 List에 담아주었다. 가독성도 별로이고 코드길이만 괜히 길어질 뿐이다.
이제 이 방식을 스트림의 기능중 '필터'를 이용해서 처리해보도록 하자.

스트림 이후코드

stream() 메서드는 Collection인터페이스가 가지고 있는 메서드이며 해당 컬렉션객체로부터 Stream객체를 생성해주는 메서드이다. Stream객체의 filter() 메서드는 해당 스트림으로부터 얻은 요소들중 filter조건에 맞는 요소들만 걸러내는중개연산 스트림이다

마지막으로 collect() 메서드를 이용하여 필터된 조건들을 List로 반환하는 Collectors.toList() 메서드를 리턴하는 스트림 최종연산 을 수행한다

 

메서드 인자에 Predicate 라는 인터페이스를 받게되는데 그 인터페이스를 구현후 test() 메서드를 오버라이딩하여 filter할 조건을 return한다. test() 메서드 인자값의 타입은 스트림객체를 제공해준 Collection객체의 제네릭 타입이 온다.

 

스트림 이전코드보다는 조금 나아졌지만 그래도 뭔가 코드라인이 길어보인다. Line 14 ~ 17 라인의 코드를 줄일수 있는 방법이 있다. 이때 사용되는게 람다 표현식 이다. 이제 람다표현식으로 수정해보자.

람다표현식

Line 14 ~ 17라인의 코드를 람다표현식으로 수정해보았다.
기존 Line 14 ~ 17의 코드는 Predicate 인터페이스를 구현한 익명클래스를 만들어 test 메서드를 오버라이딩하였지만.
람다표현식으로 변경해본뒤 코드가 깔끔해졌다. 이제 어떻게 저게 작동되는지 한번 알아보자.

Line 12 : filter(str -> "A".equals(str))
filter메서드에는 Predicate 인터페이스타입의 인자가 온다고 했다. str 변수에는 Predicate 인터페이스의 구현체인 익명클래스가
참조된다. -> 는 해당 인터페이스의 추상메서드를 호출한다. -> 는 Predicate 인터페이스의 추상메서드 test() 메서드를 의미한다.
-> 다음에 오는건 return값이다. 즉 filter할 조건의 값이되는것

여기서 궁금한건 만일 추상메서드가 2개일 경우 ->를 하게되면 어떤 메서드를 호출할까?
직접 함수형 인터페이스를 만들어 확인해보자.

함수형 인터페이스 생성

함수형 인터페이스를 생성하고 String을 인자로 받는 doSomething 추상메서드를 한개를 생성하였다.
Line 6에서 str 이부분은 doSomething 메서드의 인자로 들어갈 파라미터를 말하며 해당 파라미터가
문자열 "A"와 같은지 true/false값을 return하게 된다.
그리고 Line 8 / 9 라인에서 각각 'A'와 'B' 문자열을 던져 호출해보니 정상적으로 true / false가 return됐다.

추상메서드 2개 생성

추상메서드를 2개 더 생성하니 인터페이스쪽과 호출하는쪽 각각 컴파일 에러가 발생하였다.

 

좌측부터 설명하자면 functional interface를 람다로 표현할때는 해당 인터페이스의 추상메서드중 어느 메서드를
호출해야할지 모르기 때문에 발생이 된것이며
우측에는 functional interface의 규칙에 맞지않기 때문이다. 인터페이스에 @FunctionalInterface가 선언되있으면
해당 인터페이스는 반드시 1개의 추상메서드만 존재해야한다. @FunctionalInterface 어노테이션이 없어도
추상메서드가 1개만 있다면 해당 인터페이스를 람다표현식으로 사용할 수 있게 된다.



이 외에도 스트림을 이용하면 필터, 연산, 카운팅, 중복제거, 정렬, 그룹핑등 작업을 Collectors와 Collections
클래스와 함께 사용할 수 있다

 

 

 

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함