람다함수란?
- 익명 함수(Anonymous Function)의 한 종류(이름을 가질 필요가 없다)
- 함수를 하나의 식(expression)으로 표현한 것
장점
- 코드의 간결성
: 반복문과 같은 복잡한 식을 단순하게 표현할 수 있습니다.
- 지연연산 수행
: 불필요한 연산을 최소화 할 수 있습니다.
- 병렬처리 가능
: 멀티스레딩을 활용해 병렬처리가 가능합니다.
- 필터링 및 매핑 시 집계 결과를 쉽게 가져올 수 있습니다. (내장된 메서드 사용 가능)
단점
- 람다식 호출이 까다롭습니다.
- 람다식의
stream 사용 시 단순 for문 혹은 while문 사용 시 성능이 떨어집니다.
- 불필요하게 너무 사용하게 되면 오히려 가동성을 떨어뜨릴 수 있습니다.
how
(매개변수) 화살표→ {함수 몸체}
() -> "Hello World!";
- 단일 실행문일 경우 {괄호} 생략 가능 (함수 몸체가 return문으로만 구성 되어있는 경우 불가능)
- 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주됩니다.
- 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없습니다.
Stream API
.stream() 데이터의 흐름
.filter() 필터 조건에 맞는 데이터들을 필터링
.collect() stream의 데이터를 변형 등의 처리를 한 뒤, 원하는 자료형으로 변환
.sorted() 정렬
menuList.stream()
.filter(dish -> dish.getCalories() > 300)
.sorted(Comparator.comparing(d -> d.getCalories()))
.limit(3)
.collect(toList())
.forEach(dish -> System.out.println(dish));
- 스트림 생성
컬렉션, 배열, 파일 등 다양한 소스로부터 스트림을 생성할 수 있습니다.
List<String> myList = Arrays.asList("Java", "Python", "JavaScript", "C++");
Stream<String> streamFromList = myList.stream();
String[] myArray = {"Apple", "Banana", "Orange"};
Stream<String> streamFromArray = Arrays.stream(myArray);
- 중간 연산
스트림에 대해 여러 중간 연산을 수행하여 데이터를 필터링하고 변환할 수 있습니다.
List<String> result
= myList.stream()
.filter(s -> s.startsWith("J"))
.map(String::toUpperCase)
.collect(Collectors.toList());
- 최종 연산:
스트림의 최종 연산을 통해 최종 결과를 얻습니다. 주로 수집(collect)이나 forEach와 같은 연산이 사용됩니다.
List<String> myList = Arrays.asList("Java", "Python", "JavaScript", "C++");
myList.stream().forEach(System.out::println);
- 병렬 스트림:
데이터를 병렬로 처리할 수 있는 기능을 제공합니다.
List<String> myList = Arrays.asList("Java", "Python", "JavaScript", "C++");
myList.parallelStream().forEach(System.out::println);