자바가 람다 식 사용을 위한 함수형 인터페이스를 이미 제공하고 있다. 이전의 포스트에서 우리가 MyFunction을 정의한 것처럼 따로 만들 필요가 없어진다.
함수형 인터페이스
함수형 인터페이스 | 메서드 | 설명 |
java.lang.Runnable | void run() | 매개변수도 없고, 반환값도 없음 |
Supplier<T> | T get() | 매개변수는 없고, 반환값만 있음 |
Consumer<T> | void accept(T t) | Supplier와 반대로 매개변수만 있고, 반환값이 없음 |
Function<T, R> | R apply(T t) | 일반적인 함수. 하나의 매개변수를 받아서 결과를 반환 |
Predicate<T> | boolean test(T t) | 조건식을 표현하는데 사용됨. 매개변수는 하나, 반환 타입은 boolean |
매개변수가 2개인 함수형 인터페이스
함수형 인터페이스 | 메서드 | 설명 |
BiConsumer<T, U> | void accept(T t, U u) | 두개의 매개변수만 있고, 반환값이 없음 |
BiPredicate<T, U> | boolean test(T t, U u) | 조건식을 표햔하는데 사용됨. 매개변수는 둘, 반환값은 boolean |
BiFunction<T, U, R> | R apply(T t, U u) | 두 개의 매개변수를 받아서 하나의 결과를 반환 |
매개변수 타입과 반환타입이 일치하는 함수형 인터페이스
함수형 인터페이스 | 메서드 | 설명 |
UnaryOperator<T> | T apply(T t) | Function의 자손, Function과 달리 매개변수와 결과의 타입이 같다. |
BinaryOperator<T> | T apply(T t, T t) | BiFuncrtion의 자손, BiFunction과 달리 매개변수와 결과의 타입이 같다. |
아래는 자바가 제공하는 함수형 인터페이스를 사용한 예시이다.
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
public class Ex {
public static void main(String[] args) {
Supplier<Integer> s = () -> (int)(Math.random()*100)+1;// 1~100난수
Consumer<Integer> c = i -> System.out.println(i+", ");
Predicate<Integer> p = i -> i*2 == 0;// 짝수인지 검사
Function<Integer, Integer> f = i -> i/10*10;// i의 일의 자리를 없앤다.
List<Integer> list = new ArrayList<>();
makeRandomList(s, list); //list를 random값으로 채운다.
System.out.println(list);
printEvenNum(p, c, list);//짝수를 출력
List<Integer> newList = doSomething(f, list);
System.out.println(newList);
}
static <T> List<T> doSomething(Function<T, T>f, List<T> list){
List<T> newList = new ArrayList<>(list.size());
for (T i : list) newList.add(f.apply(i));
return newList;
}
static <T> void makeRandomList(Supplier<T> s, List<T> list) {
for(int i=0; i<10; i++) list.add(s.get());//Supplier로부터 1~100난수 받아서 list에 추가
}
static <T> void printEvenNum(Predicate<T> p, Consumer<T> c, List<T> list) {
System.out.print("[");
for (T i : list)
if(p.test(i)) c.accept(i);//짝수인지 검사하고 출력
System.out.println("]");
}
}
출처: 남궁성님 유튜브 강의
https://www.youtube.com/user/MasterNKS
'java' 카테고리의 다른 글
Lambda 04 메소드 참조 (0) | 2021.12.26 |
---|---|
Lambda 03 Predicate의 결합 (0) | 2021.12.26 |
Lambda 01 (0) | 2021.12.23 |
Serializable (0) | 2021.11.21 |
인터페이스 - 느슨한 결합력 (0) | 2021.04.25 |