21.9.14
Day38
람다
람다(Lambda)란?
1. Java SE 8에서 도입 된 기법
2. 익명함수 = Closure = @FunctionlInterface
3. 코드를 간결화 = 함수형 인터페이스 = 익명클래스
4. 람다식 함수형 인터페이스 : 하나의 인터페이스 구현이 필요한 메소드를 1개만 가지는 원형으로 선언하여 변수처럼 할당시키거나 다른 메소드들에 변수를 이요해 값을 전달하는 형태의 간단한 식
5. 표현식 사용 : (구현하는 메소드의 인수) -> {처리} 형식
6. 표현식 특징
- 람다 표현식은 익명으로 처리되어 이름이 없다.
- 람다 표현식은 compiler가 context에 맞는 타입을 유추하기에 return type이 없다.
- throws가 없다.
- 표현식 자체가 generic이 될 수 없어 type 파라미터를 선언 할 수 없다.
- 사용 예 : (), {}는 생략가능
// 매개인자로 su를 받아 출력하는 구문 int su -> System.out.println(su); // 자료형이 생략가능 su -> System.out.println(su); // 매개인자가 하나일경우에만 (), {}의 생략이 가능하다. // 매개인자가 없는 경우 ()만 사용하여 명령 실행이 가능하다 () -> System.out.println("ㅇㅋ"); // 매개인자가 두개 이상이라면 자료형을 생략하여 실행 할 수 있다. (a,b) -> {return a + b};
- 표준 함수 API -> java.util.function
43개의 인터페이스가 존재_매개인자,리턴타입을 기준으로 4개의 기본 종류
- Function R apply(T t)
- Predicate boolean test(T t)
- Consumer void accept(T t)
- Supplier T get()
- Function 인터페이스 계열
매개인자가 하나에서 리턴값이 임의의 템플릿을 수행할 때 apply 메소드를 람다로 사용한다.
apply() 메소드의 리턴 타입이 R이기 때문에 람다식 중괄호{}의 리턴값이 R의 객체가 되도록 한다.
andThen(), compse() 메소드는 Function을 매개 인자로 가지고 Function으로 리턴된다
@FunctionalInterface public interface Function<T, R>{ R apply(T t); }
//ex 1 Function<Integer, Integer> a1 = e -> e * 2; //ex 2 Function<Integer, Integer> a2 = e -> e * e; a1.compose(a2).apply(2); // 숫자 2를 e로 전달한 후에 a2, a1순으로 수행한다. a1.andThen(a2).apply(2); // 숫자 2를 e로 전달한 후에 a1, a2순으로 수행하겠다.
Predicate 인터페이스 계열
조건 집합을 정의하고 지정된 객체가 조건 충족 유무에 따라 true /false로 리턴하는 메소드를 가진다.@FunctidnalInterface public interface Predicate<T>{ boolean test(T t); }
Supplier 인터페이스 계열
- 어떤 값을 리턴하는 인터페이스로 매개 인자가 없는 함수의 원형이며
int, long, double, boolean 값을 반환하는 BooleanSupplie도 정의 되어 있다.- 추상 메소드 get()이 정의 되어 있다.
- 각 메소드는 정의된 자료형을 리턴하도록 되어있어 람다의 메소드 참조, 생성자 참조등과 함께 요소를 관리하는 컬렉션의 객체를 사용할 때 적용하면 코드가 간결해진다.
- Consumer 인터페이스 계열
- 컨슈머 인터페이스는 값을 받아 처리하지만 반환값을 리턴하지 않는 인터페이스이다 반환값이 없는 void형 Function과 흡사하다.
- UnaryOperator
@FunctionalInterface public interface UnaryOperator<T> extends Function <T,T>{ static <T> UnaryOperator <T> identity(); }
연산자 계열
연산 인수를 그대로 리턴한다.
@FunctionalInterface public interface BinaryOperator<T> extends Function <T,T,T>{ static <T> BinaryOperator <T> identity(); }
람다 활용법
_메소드와 생성자 참조
- jdk 8부터는 메소드와 생성자를 직접 참조 할 수 있다.
- C++ :: Scope 연산자를 사용한다.
- 생성자 참조 : class_name :: new
- 메소드 참조 : class_name :: method_name = static
- non-static : instance_name :: method_name
Author And Source
이 문제에 관하여(21.9.14), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jslover/21.9.14저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)