람다식 - 2. 자바 API의 함수형 인터페이스

Ⅱ. 자바 API의 함수형 인터페이스

1. 함수형 인터페이스와 표식 (어노테이션 annotaion)

 - 함수형 인터페이스 : 기능 하나를 정의하는 인터페이스 (인스터스가 필요하지 않을 수도 있음)

    ※ 함수형 인터페이스의 조건 : 추상 메소드가 딱 하나만 존재

 - @FunctionalInterface : 이 것이 함수형 인터페이스임을 명시하는 어노테이션

// Example
package sample;

// 이 것이 함수형 인터페이스임을 명시하는 어노테이션
@FunctionalInterface
interface Calculating {
	int cal(int a, int b);	// 함수형 인터페이스
	// default 메소드도 추상메소드가 아님
	default int muliply(int a, int b) {
		return a * b;
	}
	// static 메소드도 추상메소드가 아님
	static int divide(int a, int b) {
		return a / b;
	}
	// 즉, 추상메소드가 하나라면 다른 메소드가 들어와도 가능
}

public class Main {
	public static void main(String[] args) {
		Calculating c;
		c = (a, b) -> a + b;
		System.out.println(c.cal(55, 44));
	}
}

 

2. 함수형 인터페이스가 정의된 패키지 사용하기

 - Predicate<T> 사용

    -  Predicate<T> 내에는 test(T t) 메소드가 존재 (전달인자를 근거로 참 또는 거짓을 반환하는 메소드)

    ※ Predicate : Type T 인자를 받고 boolean을 리턴하는 함수형 인터페이스

// Example
package sample;
import java.util.function.Predicate;
import java.util.*;


// Predicate<T> 사용
public class Lambda04 {
	static int sum(Predicate<Integer> p, List<Integer> list) {
		int s = 0;
		
		// test()에 인자를 전달하면 boolean이 리턴
		for(int n: list) {
			if(p.test(n)) {		// test가 true를 반환하는 숫자만 분리해서 중첩함
				s += n;
			}
		}	
		
		return s;
	}
	
	public static void Main(String[] args) {
		// Type T 인자를 받고 boolean을 리턴
		Predicate<Integer> p;
		
		// boolean test(Integer number)에 주어진 숫자가 5의 배수이면 true를 반환
		p = (number) -> number % 5 == 0;

		List<Integer> list = new ArrayList<>();
		for(int i = 0; i <= 50; i++) {
			list.add(i);
		}
		int result = sum(p, list);
		System.out.println(result);		// 275
	}
}

 

 - Function 사용

    - R apply(T t) : T와 R이 모두 제니릭 타입 매개변수

// Example
package sample;
import java.util.*;
import java.util.function.Function;
public class Main {
	
	public static void main(String[] args) {
		// 문자열을 받아서 정수를 반환함
		Function<String, Integer> f;
		
		f = s -> s.length();
		
		System.out.println(f.apply("Hello"));			// 5
		System.out.println(f.apply("I am a good boy"));		// 15
	}
}