Java - Stream과 Lambda
Stream 정리
Java Stream은 데이터를 추상화하여 데이터 타입과 무관하게 간결하고 일괄적으로 데이터(컬렉션, 배열)를 처리할 수 있게 하는 Api이다.
Java Stream 특징
일회성이다. 반환값을 정의하지 않는 한 재사용이 불가하며, 처리한 결과물은 사라진다.
기존 자료를 변경하지 않는다.
최종 연산이 호출되어야 중간연산이 진행된다.
중간 연산
filter
조건문 사용 -> 조건문에 해당하는 데이터만 가져옴
list.stream().filter(i -> i.getNumber() > 10)
filter() + findAny() 조합도 유용
map
각 요소에서 특정 속성만을 추출하여 가져옴
list.stream().map(i -> i.getId())
sorted
.sorted() | .sorted(Comparator.comparing(기준 람다식))
역순
.sorted(Comparator.reverseOrder())
.sorted(Comparator.comparing(기준 람다식).reversed())
최종 연산
forEach
filter나 map과 같은 중간연산이 없다면
Stream.forEach()보다 Collection.forEach()로 작업하는 것이 thread-safe하다.
count
sum
list.stream().mapToInt(i -> i.getPrice()).sum()
reduce(초기값, (a, b) -> {실행문})
reduce(0, (a, b) -> a + b)
위의 예시는 최종적으로 요소들의 합이 반환하는 코드이다.
"", (s1, s2) -> if(s1.length >= s2.length) return s1; else return s2;
위의 예시는 가장 긴 문자열 반환하는 코드이다.
collect
list
stream().map().collect(Collectors.toList())
map
stream().filter().collect(Collectors.toMap(i -> i.getKey(), i -> i.getValue()))
stream().collect(Collectors.toMap(Object::getId, Function.identity()))
Function.identity() 가 Object 반환
toMap 사용 시 중복 key있을 경우 k, v 설정 뒤에 (e1, e2) -> e1) 추가하여 처리
grouping
stream().collect(Collectors.groupingBy(i -> i.getId()))
반환값은 Map<Long, List<Object>> 아이디를 기준으로 그룹화됨
Lambda 정리
람다란 단일 추상 메서드를 가지는 함수형 인터페이스를 활용하는 문법이다.
람다와 메서드 참조를 통해 함수형 프로그래밍을 더욱 효과적으로 구현할 수 있다.
람다의 특징
매개변수만으로 자료를 처리한다.
독립적이기에 병렬처리에 적합하다.
람다식을 변수로 활용 가능하다.
람다의 구조
(매개변수) -> { 실행문; }
매개변수가 하나일 때, 실행문이 한 줄일 때 괄호 생략이 가능하다.
매개변수 -> 실행문
람다 예시
(a, b) -> { return a + b }
(a, b) -> a == b ? a : b
age -> age > 19 ? '성인' : '미성년자'
메서드 참조 예시
Object::method
생성자의 경우 Object::new
기본 생성자라면 () -> new Object(); 와 같음
매개변수가 있다면 i -> new Object(i);와 같음
댓글을 작성해보세요.
함수형 프로그래밍
함수형 인터페이스 -> 람다; 하나의 메서드