람다식(Lambda expression)이란?
- 식별자 없이 실행 가능한 함수
- 함수의 이름을 따로 정의하지 않아도 곧바로 함수처럼 사용할 수 있음
- 문법이 간결하여 보다 편리함
- 익명 함수
※ 람다식이 코드를 보다 간결하게 만들어주지만, 무조건 좋은 것은 아님
- 람다를 사용하여 만든 익명 함수는 재사용 불가
- 람다만을 사용할 경우, 비슷한 메소드를 중복되게 생성할 가능성이 있음
[기존의 메소드 형식]
반환타입 메소드이름(매개변수 선언) {
수행 코드 블록
}
[람다식의 형식]
반환타입 메소드이름(매개변수 선언) -> {
수행 코드 블록
}
public static void main(String[] args) {
String[] s = {"Korea", "USA", "Japan", "China"};
ArrayList<String> list = new ArrayList<>(Arrays.asList(s));
Stream<String> stream = list.stream();
stream.map(String::toUpperCase)
.forEach(System.out::println);
/*
같은 코드
stream.map(str->str.toUpperCase())
.forEach(x-> System.out.println(x));
*/
/*
KOREA
USA
JAPAN
CHINA
*/
}
- ::(이중 콜론 연산자)
- 매개변수를 중복해서 사용하고 싶지 않을 때 사용
스트림이란?
- 람다를 활용할 수 있는 기술 중 하나
- "데이터의 흐름"
- 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자
- 스트림을 활용해서 필터링, 데이터 변경, 다른 타입이나 자료구조로 변환 가능
스트림의 특징
- 데이터 소스 변경 X
- 작업을 내부적으로 반복 처리
- 컬렉션의 요소를 모두 읽고 나면 닫혀서 재사용 불가
- 필요할 경우 재생성 필요
스트림 구조
1. 스트림 생성
- Stream<T> Collection.stream()을 이용하여 해당 컬렉션을 기반으로하는 스트림 생성
2. 중간 연산
- 데이터의 형변환 혹은 필터링, 정렬 등 스트림에 대한 가공
- map(변환), sorted(정렬), skip(스트림 자르기), limit(스트림 자르기) 등등
3. 최종 연산
- 스트림의 요소를 소모해서 결과 반환
- 최종 연산 이후 스트팀이 닫혀 재사용 불가
- 최종 연산의 결과값은 단일 값일 수도 있고 배열 혹은 컬렉션 일 수 있음
- collect()를 이용해서 다른 컬렉션으로 변경 혹은 reduce를 이용해서 incremental calculation하는 것도 많이 사용됨
기본 구조
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Korea");
list.add("USA");
list.add("Japan");
list.add("China");
System.out.println(list); //[Korea, USA, Japan, China]
List<String> result =
list.stream() //스트림 생성
.limit(2) //중간 연산
.collect(Collectors.toList()); //최종 연산
System.out.println(result); //[Korea, USA]
Set<String> set =
list.stream() //스트림 생성
.filter("Korea"::equals) //중간 연산
.collect(Collectors.toSet()); //최종 연산
set.forEach(System.out::println); //Korea
}
Array -> Stream
public static void main(String[] args) {
String[] array = {"Korea", "USA", "Japan", "China"};
Stream<String> stringStream = Arrays.stream(array);
stringStream.forEach(x -> System.out.println("나라 이름 : " + x));
System.out.println();
Arrays.stream(array).forEach(x -> System.out.println("나라 이름 : " + x));
}
reduce 활용
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//1~10 합
Integer result = list.stream().reduce(0, Integer::sum);
System.out.println(result);
}