- 자주 사용되는 다양한 함수형 인터페이스를 제공
우리가 사용하는 함수형 인터페이스는 사실상 몇 개 없다.
함수형 인터페이스 | 메서드 | 설명 |
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 |
Predicate<T> 사용 방법
문자열의 길이를 받아서 참 길이가 0이면 참 , 아니면 거짓
Predicate<String> isEmptyStr = s -> s.length()==0;
String s = "";
if(isEmptyStr.test(s)) // if(s.length()==0)
System.out.println("This is an empty String.");
함수형 인터페이스를 알맞게 넣어주세요.
[1] f = () -> (int)(Math.random()*100)+1;
[2] f = i -> System.out.print(i+", ");
[3] f = i -> i%2 == 0;
[4] f = i -> i/10*10;
내가 적은 정답
[1] = Supplier
[2] = Runnable ( 임포트하고 )
[3] = Predicate
[4] = ?
정답
[1] = Supplier<Integer> // 제네릭 타입 맞아야 하므로 Integer 적어줘야 함.
[2] = Consumer // 값을 받기만 하므로 consumer임 매개변수 i 있는데 Runnable은 매개변수도 없고, 반환 값도 없음.
[3] = Predicate<Integer> // 역시 제네릭 포함으로 적어줘야 함. 결과를 true 아니면 false로 주기 때문.
[4] = Function<Integer,Intger> // 입력 값도 있고, 출력 값도 있음 25를 넣으면 20을 반환해 줌.
매개변수가 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) | 두 개의 매개변수를 받아서 하나의 결과를 반환 |
매개변수는 2개까지 받을 수 있고 3개를 받으려고 하면 직접 구현
@FunctionalInterface
interface TriFunction<T,U,V,R> {
R apply(T t, U u, V V);
}
매개변수의 타입과 반환 타입이 일치하는 함수형 인터페이스
함수형 인터페이스 | 메서드 | 설명 |
UnaryOperator<T> | T apply(T t) | Function의 자손, Function과 달리 매개변수와 결과의 타입이 같다. |
BinaryOperator<T> | T apply(T t, T t) | BiFunction의 자손, BiFunction과 달리 매개변수와 결과의 타입이 같다. |
예 제
package lamdaPt;
import java.util.*;
import java.util.function.*;
public class lamda3 {
public static void main(String[] args) {
Supplier<Integer> s = ()-> (int)(Math.random()*100)+1; // 1~100 난수
Consumer<Integer> c = i -> System.out.print(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);
System.out.println(list);
// 짝수를 출력
printEvenNum(p, c, list);
List<Integer> newList = doSomething(f, list);
System.out.println(newList);
}
static <T> void makeRandomList(Supplier<T> s, List<T> list) {
for(int i=0; i<10; i++) {
list.add(s.get());
}
}
//짝수인지 검사 Predicate, 어떻게 출력 Consumer, 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); // 짝수면 Consummer 출력
}
System.out.println("]");
}
// 1의 자리 없애는 람다식 Function 그리고 list를 받아왔음
static <T> List<T> doSomething(Function<T, T> f, List<T> list){
List<T> newList = new ArrayList<T>(list.size());
for(T i : list) {
newList.add(f.apply(i));
}
return newList;
}
}
'Java' 카테고리의 다른 글
Java : GC(Garbage collector)에 대해서 - 기초 (0) | 2021.08.25 |
---|---|
Java : JVM 이란? 자바 메모리 구조 (0) | 2021.08.25 |
Java : 람다식, 함수형 인터페이스 - 기초 (0) | 2021.08.16 |
Java : 람다식 ? - 기초 (0) | 2021.08.16 |
Java : 쓰레드 wait()과 notify() - 기초 (0) | 2021.08.12 |