java 8 새로운 기능 입문 부터 응용 제1장 Lambda 표현 식 및 FunctionalInterface 함수 인터페이스
16622 단어 자바 8 새로운 기능java 8 새로운 기능 입문 부터 응용 까지
Lambda 표현 식
Lambda 표현 식 은 자바 8 이 도입 한 중량급 문법 사탕 입 니 다.만약 에 친구 들 이 이전에 다른 프로 그래 밍 언어(Groovy,Scala,js 등)를 접 한 적 이 있다 면 Lambda 표현 식 에 익숙 할 것 입 니 다.자바 의 람 다 는 뒤 늦게 왔 다.다음은 자바 8 에 새로 가입 한
List.forEach()
만 예 를 들 어 설명 한다.List.forEach()
의 용법 을 살 펴 보 자. List<String> list= Arrays.asList("a","b","c");
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
위의 문 구 는 매우 수 다스 러 운 것 을 알 수 있 습 니 다.우 리 는 list 의 값 을 출력 하고 싶 을 뿐 인 데 왜 익명 류 를 정의 하고 방법 을 써 야 합 니까?
List<String> list= Arrays.asList("a","b","c");
list.forEach((Object a)->{
System.out.println(a);
});
위 에 것 보다 훨씬 간소화 한 거 아니 야?그러나 이것 도 부족 하 다.위 에서
list
의 범 형 에 대해 정 의 를 내 렸 는데 왜 우리 가 성명 을 해 야 합 니까?Object
List<String> list= Arrays.asList("a","b","c");
list.forEach(a->{
System.out.println(a);
});
기왕 이렇게 된 이상 아직 부족 하 다.대괄호 귀 차 당 의견 이 있 습 니 다.그래서
List<String> list= Arrays.asList("a","b","c");
list.forEach(a->System.out.println(a));
주의:대괄호 가 생략 될 때
;
번호 도 동시에 생략 해 야 합 니 다.1 판 에 람 다가 없 을 때의 상황 을 비교 해 보면 많이 간소화 되 지 않 았 나 요?
lambda 표현 식 특징:1
Lambda 쓰기
a -> System.out.println(a)
(a,b) -> System.out.println(a+":"+b)
(a,b) -> {
if(a==b){
System.out.println(a+":"+b);
}
}
4.다 중 매개 변수 다 중 문 구 는 반환 값 이 있 습 니 다.
(a,b) -> {
if(a==b){
return a;
}else{
return b;
}
}
5.단일 매개 변수 단일 문 구 는 반환 값
a -> a
이 있 습 니 다.함수 인터페이스 함수 인터페이스
Function alInterface 함수 인터페이스(이하 중국어 이름
를 직접 부 를 것 입 니 다.엄 밀 히 말 하면 새로운 것 이 아 닙 니 다.새로운 정의 일 뿐 엄격 하지 않 은 정 의 는 다음 과 같 습 니 다.실현 되 지 않 은 방법 이 하나 밖 에 없 는 모든 인 터 페 이 스 를 통칭 한다
.아까 의
List.forEach()
예 를 들 어 그 매개 변 수 는java.util.function.Consumer
이다.package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Consumer<T> {
/**
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t);
// default static
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
그 중에서 실현 되 지 않 은 방법 은
accept(T t)
하나 밖 에 없 기 때문에java.util.function.Consumer
류 는 함수 인터페이스 이 고 실제 Lambda 표현 식 은 사실상 암시 적 으로 이 인 터 페 이 스 를 실현 하고 그 중에서 실현 되 지 않 은 방법accept(T t)
을 다시 썼 다.방법 내 부 를 살 펴 보 겠 습 니 다. default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
사실은 반복 적 으로 list 의 요 소 를
List.forEach()
방법의 매개 변수 로 입력 하여 실행 하 는 것 입 니 다.모든 것 이 간단 합 니 다.Lambda 표현 식 은 컴 파일 러 에 불과 합 니 다.개발 을 간단하게 하기 위해 작은 무늬 를 만 들 었 을 뿐 입 니 다.@FunctionalInterface 주석
@FunctionalInterface 주 해 는 실제 의미 가 인터페이스 가 함수 인터페이스 에 속 하 는 지 에 영향 을 주지 않 습 니 다.그 주요 역할 은 개발 자 에 게 알려 주 고 컴 파일 러 에 게@FunctionalInterface 에 표 시 된 인터페이스 가 실현 되 지 않 은 방법 만 있 는 지 확인 하 는 것 입 니 다.
자바 8 에 추 가 된 함수 인터페이스
자바 8 에 추 가 된 함수 인 터 페 이 스 는
accept(T t)
패키지 에 있 습 니 다.인터페이스
매개 변수
반환 값
BiConsumer
T U
void
BiFunction
T U
R
BinaryOperator< T >
T T
T
BiPredicate
T U
boolean
BooleanSupplier
boolean
Consumer< T >
T
void
DoubleBinaryOperator
double double
double
DoubleConsumer
double
viod
DoubleFunction< R >
double
R
DoublePredicate
double
boolean
DoubleSupplier
double
DoubleToIntFunction
double
int
DoubleToLongFunctio
double
long
DoubleUnaryOperator
double
double
Function
T
R
IntBinaryOperator
int
int
IntConsumer
int
viod
IntFunction< R >
int
R
IntPredicate
int
boolean
IntSupplier
int
IntToDoubleFunction
int
double
IntToLongFunction
int
long
IntUnaryOperator
int
int
LongBinaryOperator
long long
long
LongConsumer
long
viod
LongFunction< R >
long
R
LongPredicate
long
boolean
LongSupplier
long
LongToDoubleFunction
long
boolean
LongToIntFunction
long
int
LongUnaryOperator
long
long
ObjDoubleConsumer< T >
T double
void
ObjIntConsumer< T >
T
int
ObjLongConsumer< T >
T
long
Predicate< T >
T
boolean
Supplier< T >
T
ToDoubleBiFunction
T U
double
ToDoubleFunction< T >
T
double
ToIntBiFunction
T U
int
ToIntFunction< T >
T
int
ToLongBiFunction
T U
long
ToLongFunction< T >
T
long
UnaryOperator< T >
T
T
https://blog.csdn.net/yitian_66/article/details/81010434 ↩︎