람다식 (Lambda Expression)
- 근본적으로는 동일한 용어이나 이제 이해가간다
- 함수 = 클래스에 독립적 (일반적용어)
- 메서드 = 클래스에 종속적 ( 객체지향개념 용어)
- 함수(메서드를) 간단한 식(expression) 으로 표현하는 방법
-함수(메서드)
int max(int a , int b) {
return a > b ? a : b ;
}
-람다식,이름이없는함수(anonymous function)반환타입 이름지움
(int a , int b) -> {
return a > b ? a : b ;
}
# (a, b) -> a > b ? a:b
람다식 작성하기
1.메서드의 이름,반환타입제거후 -> 를 블록{} 앞에 추가함
//함수(메서드)
int max(int a , int b) {
return a > b ? a : b ;
}
//람다식
(int a , int b) -> {
return a > b ? a : b ;
}
2.반환값이 있는경우 , 식이나 값만적고 return 문생략가능 끝에(;안붙임)
(int a , int b) -> {
return a > b ? a : b ;
}
(int a, int b) -> a > b ? a:b
3.매개변수의 타입이 추론가능하면 생략가능 (대부분의경우 생략가능)
(a, b) -> a > b ? a:b
람다식 주의사항
-매개변수가 하나인경우 ,괄호() 생략가능 (타입이없을때만)
(a) - > a * a
a- > a * a // OK
(int a ) - > a * a
int a -> a * a //애러
-블록안의 문장이 하나뿐일때, 블록{} 생략가능 ( 끝에 ; 안붙임)
(int i) -> {
System.out.println(i);
}
(int i) - > System.out.println(i)
-단, 하나의 문장이 return문이면 블록{}생략불가
람다식은 익명객체 !
- 익명함수가 아니라 익명개체이다
- 익명객체인이유는 (함수형인터페이스의 추상메서드를 사용하고있는중)
- 참조변수 (함수형인터페이스의 오버라이딩규칙도.)
함수형 인터페이스
- 단 하난의 추상메서드만 선언된 인터페이스
Predicate 의 결합
- and(), or(), negate()로 두 Predicate를 하나로 결합 (default)메서드
스트림 (JDK 1.8 부터 통일)
- 데이터의 연속적인 흐름
- 다양한 데이터 소스(컬렉션 ,배열) 를 표준화 된 방법으로 다루기위한것
-
컬렉션 프레임워크 List , Set , Map , 배열 > stream
- (데이터소스) > 스트림만들기 > 중간연산 0~N번 > 최종연산,스트림의요소 사용다하면끝 (결과1번) 3단계
- 스트림은 1회용 최종연산후 닫힘 , 새로 생성자를 만들어야함 , 원본은건드리지않는다 읽기만할뿐
- 지연된연산 ( 최종연산전까지 , 중복된연산이 적용되지않음)
스트림의 최종연산
- reduce 스트림의 요소를 하나씩 줄여가면서 ( 리듀싱 ) 계산한다
스트림의 중간연산
- 중간연산은 요소를 소비하지않는다
Optional
- Null을 직접다루면 위험 , Null을 체크하려고 (if문 쓰면 지저분하니까)
- null point exception ..
- null > Optional 객체에 집어넣기위함
Leave a comment