본문 바로가기

JAVA

java.util.function 패키지 21. 05. 06.

1.4 java.util.function 패키지

대부분의 메서드는 타입이 비슷한데, java.util.function 패키지에 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해 놓음.

 

 

🔷 타입 문자 T는 Type을, R은 Return Type을 의미함.

 

 

  • 조건식의 표현에 사용되는 Predicate
    Function의 변형으로, 반환타입이 boolean이다. 조건식을 람다식으로 표현하는데 사용된다.
  •  
  • 매개변수가 두 개인 함수형 인터페이스
    이름 앞에 접두사 'Bi'가 붙는다.

  • UnaryOperator와 BinaryOperator
    Function에서 매개변수의 타입과 반환 타입이 같다면 Function 대신 UnaryOperator를 사용할 수 있다.
  • 컬렉션 프레임웤과 함수형 인터페이스

    🔷 Map객체를 한 번씩 순회하기 위해 Iterator를 이용해서 이터레이터화를 시키면 Map 객체가 Entry 타입의 이터레이터가 된 걸 반복문으로 돌렸었는데 이 작업을 forEach로 간략하게 수행할 수 있다.

LambdaEx04.java

package chap14.ex04;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class LambdaEx04 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        for(int i = 0 ; i < 10 ; i++) {
            list.add(i);
        }
        // list의 모든 요소를 출력
        list.forEach(i -> System.out.print(i+","));
        System.out.println();

        // list에서 2 또는 3의 배수를 제거
        list.removeIf(x -> x % 2 == 0 || x % 3 == 0);
        System.out.println(list);

        list.replaceAll(i -> i * 10); // list의 각 요소에 10을 곱함.
        System.out.println(list);

        Map<String, String> map = new HashMap<>();
        map.put("1", "1");
        map.put("2", "2");
        map.put("3", "3");
        map.put("4", "4");

        // map의 모든 요소를 k,v 형식으로 출력.
        map.forEach((k,v) -> System.out.print("{"+k+","+v+"},"));
    }
}



LambdaEx05.java

package chap14.ex05;

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;
import java.util.function.UnaryOperator;

public class LambdaEx05 {
    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의 일의 자리를 없앤다. UnaryOperator<Integer> 인티져 두 개 쓸 거면 이거 쓰는 게 나음.
        UnaryOperator<Integer> f = i -> i/10*10; // Function과 호환성 굿.

        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) {
//    static <T> List<T> doSomething(Function<T, T>f, List<T> list) {
        List<T> newList = new ArrayList<T>(list.size());
        for(T i : list) { // capacity : 10
            newList.add(f.apply(i));
        }
        // newList.add(11); 을 하면 size는 11이 된다.
        // 그 후 for문을 돌리면 20번 실행. (한 번 늘어날 때마다 capacity 단위만큼 늘어나서)
        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());
        }
    }
}

interface Runnable {
    void run();
//    default doSomething() {
//        
//    }
}



List<T> newList = new ArrayList<T>(list.size()); 객체를 초기화 했을 때 무엇이 들어가 있을까? newList를 콘솔에 찍어보면 ? []로 출력된다.

 

 

✨ (참고) 자바에서 익명 클래스와 자바스크립트에서 익명 함수는 상당히 비슷하다.
자바스크립트에서도 람다식을 쓸 수 있다.