JAVA

자바 람다함수(with 함수형 인터페이스)

쿠카이든 2022. 2. 14. 11:34
728x90
public class LamdaEx {
    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; // 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> 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());
        }
    }
}
----------------------------결과(바뀔 수 있음)--------------------------------------
[22, 39, 82, 94, 49, 74, 100, 5, 47, 19]
[22, 82, 94, 74, 100, ]
[20, 30, 80, 90, 40, 70, 100, 0, 40, 10]
  • 람다식에서 함수형 인터페이스들을 사용하는 예제이다.
    • java.util.function 패키지에 일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해 놓음
    • 매번 새로운 함수형 인터페이스를 정의하지 말고, 가능하면 이 패키지의 인터페이스를 활용하는 것이 메서드 이름도 통일되고, 재사용성이나 유지보수 측면에도 좋다.
    • 위 예제에서 사용된 함수형 인터페이스는 아래와 같다.

함수형 인터페이스메서드설명

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
728x90