ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] java.util.function 패키지란?
    Java 2022. 1. 22. 00:01

    java.util.fuction 패키지란?

    JDK8부터 지원하며 자주 사용되는 함수형 인터페이스를 제공합니다.

     

    함수형 인터페이스란?

    1개의 추상 메서드를 갖고 있는 인터페이스로 익명 클래스나 람다식을 통해 사용할 수 있습니다.

    https://junuuu.tistory.com/65

     

    java.util.function 패키지가 제공하는 인터페이스에 대해 알아보겠습니다.

     

    가장 기본이 되는 함수 인터페이스

    표만 보아서는 이해가 잘 안 될 수도 있습니다.

    T, R 등 제네릭스도 포함되어 있기 때문에 살짝 거부감도 들었습니다.

    Predicate <T> 함수형 인터페이스를 예시를 통해 어떻게 사용되는지 살펴보겠습니다

    Predicate<String> isEmptyStr = s -> s.length() == 0;
    String str = "";
    
    if(isEmptyStr.test(str)) // == if(str.length()==0)
    	System.out.println("This is an empty String.");

    Predicate <T>에서 타입 변수 T에 String이 들어온 모습입니다.

    Predicete <String>을 타입으로 가지는 isEmptyStr 변수에 반환 타입이 boolean인 람다식(s -> s.length() ==0)을 대입했습니다.

    이후에 isEmptyStr변수를 활용하기 위해서는 메서드인 test를 사용하여 실제로 사용한 모습입니다.

     

    추가로 Supplier <T> 함수형 인터페이스를 예시를 통해 어떻게 사용되는지 살펴보겠습니다.

    Supplier<Integer> makeRandomNumber =() -> (int) (Math.random() * 100) +1;
    int randomNumber = makeRandomNumber.get();
    System.out.println(randomNumber);

    Supplier <T>에서 타입 변수 T에 Integer가 들어온 모습입니다.

    Supplier <Integer>를 타입으로 가지는 makeRandomNumber 변수에 반환 타입이 int인 람다식을 대입하였습니다.

    이후에 makeRandomNumber 변수를 활용하기 위해서는 메서드인 get을 사용하여 실제로 사용한 모습입니다.

     

     

    매개변수가 2개인 함수형 인터페이스

    기본이 되는 함수 인터페이스에 둘을 뜻하는 접두사 Bi를 붙여 이름 지어졌습니다.

     

     

    매개변수가 3개 이상인 함수형 인터페이스

    @FunctionalInterface
    interface TriFunction<T, U, V, R>{
    	R apply(T t, U u, V v);
    }

     

    3개부터는 필요하다면 직접 함수형 인터페이스를 위와 같이 만들어서 사용해야 합니다.

     

     

    매개변수의 타입 와 반환 타입이 일치하는 함수형 인터페이스

     

    코드를 통해 알맞은 함수형 인터페이스를 알아보겠습니다.

    Supplier<Integer> s = () -> (int) (Math.random()* 100) + 1; //입력값 필요없고 반환값 필요
    Consumer<Integer> c = i -> System.out.print(i + " , "); //입력값 i가 필요하고 반환값 필요없음
    Predicate<Integer> p = i -> i%2==0; //boolean 값
    //Predicate<Integer, Boolean>이라고 사용해야 하지만 반환타입은 항상 Boolean이여 사용하지 않습니다.
    Function<Integer, Integer> f = i -> i/10*10; //입력값 i 가 필요하고 반환값 필요
    
    List<Integer> list = new ArrayList<>();
    makeRandomList(s, list); //list를 랜덤으로 생성
    System.out.println(list);
    
    
    static <T> void makeRandomList(Supplier<T> s, List<T> list){
    	for(int i=0;i<10;i++){
        	list.add(s.get());
        }
    }

    Supplier <T>와 List <T> 타입을 인자로 받고 list에 랜덤 값을 추가하는 코드입니다.

    Supplier의 메서드인 get을 활용합니다. (s.get())

     

     

     

    java.util.function 패키지를 사용하는 이유

    우리가 사용하는 함수의 종류는 몇 가지 없고, 자바에서 미리 만들어서 제공함으로써 개인이 각각 만드는 것보다 이미 만들어진 것을 사용함으로써 표준화를 이룹니다.

     

    표준화함으로써 다른 사람이 좀 더 이해하기 쉽습니다.(개발자들끼리 코드를 이해하기 쉬워짐)

     

    물론 직접 만들어서 사용해도 됩니다.

     

     

     

    출처

    https://www.youtube.com/watch?v=HPxnDM_FkGc&t=979s 

    https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/function/package-summary.html

     

    java.util.function (Java SE 16 & JDK 16)

    package java.util.function Functional interfaces provide target types for lambda expressions and method references. Each functional interface has a single abstract method, called the functional method for that functional interface, to which the lambda expr

    docs.oracle.com

     

    댓글

Designed by Tistory.