- 자주 사용되는 다양한 함수형 인터페이스를 제공

 

우리가 사용하는 함수형 인터페이스는 사실상 몇 개 없다.

함수형 인터페이스 메서드 설명
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;
	}
}

 

+ Recent posts