본문 바로가기
java

Lambda 02 - java.util.function 패키지

by 킹차니 2021. 12. 23.

자바가 람다 식 사용을 위한 함수형 인터페이스를 이미 제공하고 있다. 이전의 포스트에서 우리가 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