Java

138. java.util.function - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2025. 1. 9. 15:39

1. java.util.function패키지

  • 자주 사용되는 다양한 함수형 인터페이스를 제공
함수형 인터페이스 메서드 설명
java.lang.Runnable void run() 매개변수도 없고, 반환값도 없음
Supplier<T> T get() -> T 매개변수는 없고, 반환값만 있음
Consumer<T> T -> void accept(T t) Supplier와 반대로 매개변수만 있고, 반환값이 없음
Function<T, R> T -> R apply(T t) -> R 일반적인 함수. 하나의 매개변수를 받아서 결과를 반환
Predicate<T> T -> boolean test(T t) -> boolean 조건식을 표현하는데 사용됨
매개변수는 하나, 반환 타입은 boolean
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.");
Supplier<Integer> f = () -> (int)(Math.random()*100)+1;
Consumer<Integer> f = i -> System.out.print(i+", ");
Predicate<Integer> f = i -> i % 2 == 0;
Function<Integer, Integer> f = i -> i / 10 * 10;
  • 매개변수가 2개인 함수형 인터페이스
함수형 인터페이스 메서드 설명
BiConsumer<T,U> T, U -> void accept(T t, U u) 두개의 매개변수만 있고, 반환값이 없음
BiPredicate<T, U> T, U -> boolean test(T t, U u) -> boolean 조건식을 표현하는데 사용됨 매개변수는 둘, 반환값은 boolean
BiFunction<T, U, R> T, U -> R apply(T t, U u) -> R 두 개의 매개변수를 받아서 하나의 결과를 반환
  • 매개변수의 타입과 반환타입이 일치하는 함수형 인터페이스
함수형 인터페이스 메서드 설명
UnaryOperator<T>(단항연산자) T -> T apply(T t) -> T Function의 자손,  Function과 달리 매개변수와 결과의 타입이 같다.
BinaryOperator<T>(이항연산자) T, T -> T apply(T t, T t) -> T BiFunction의 자손, BiFunction과 달리 매개변수와 결과의 타입이 같다.
public class Ex02_03 {
    public static void main(String[] args) {
        Supplier<Integer> s = () -> (int)(Math.random()*100)+1;
        Consumer<Integer> c = i -> System.out.print(i+", ");
        Predicate<Integer> p = i -> i%2==0;
        Function<Integer, Integer> f = i -> i/10*10;

        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> 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;
    }

    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("]");
    }

    static <T> void makeRandomList(Supplier<T> s, List<T> list) {
        for (int i = 0; i < 10; i++) {
            list.add(s.get());
        }
    }
}