자바 함수 식 인 터 페 이 스 를 어떻게 능숙 하 게 사용 하 는 지 상세 하 게 설명 하 다.

함수 식 인터페이스의 유래
Lambda 표현 식 을 사용 하 는 전 제 는 함수 식 인터페이스 가 필요 하 다 는 것 을 알 고 있 습 니 다.Lambda 표현 식 을 사용 할 때 인터페이스 이름,추상 적 인 방법 이름 에 관심 이 없습니다.추상 적 인 방법의 매개 변수 목록 과 반환 값 형식 에 만 관심 을 가 집 니 다.따라서 Lambda 표현 식 을 사용 할 수 있 도록 JDK 에서 자주 사용 하 는 함수 식 인 터 페 이 스 를 많이 제공 합 니 다.

package com.bobo.jdk.fun;

public class Demo01Fun {

    public static void main(String[] args) {
        fun1((arr)->{
            int sum = 0 ;
            for (int i : arr) {
                sum += i;
            }
            return sum;
        });
    }

    public static void fun1(Operator operator){
        int[] arr = {1,2,3,4};
        int sum = operator.getSum(arr);
        System.out.println("sum = " + sum);
    }
}

/**
 *      
 */
@FunctionalInterface
interface Operator{

    int getSum(int[] arr);
}
2.함수 식 인터페이스 소개
JDK 에서 제공 하 는 함수 식 인 터 페 이 스 는 주로 자바 util.function 패키지 에 있 습 니 다.
2.1 Supplier
반환 값 이 있 는 인터페이스 가 없습니다.Lambda 표현 식 은 데 이 터 를 되 돌려 주 는 형식 을 제공 해 야 합 니 다.

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}
사용:

/**
 * Supplier         
 */
public class SupplierTest {

    public static void main(String[] args) {
        fun1(()->{
            int arr[] = {22,33,55,66,44,99,10};
            //           
            Arrays.sort(arr);
            return arr[arr.length-1];
        });
    }

    private static void fun1(Supplier<Integer> supplier){
        // get()                 
        Integer max = supplier.get();
        System.out.println("max = " + max);

    }
}
2.2 Consumer
인터페이스 에 되 돌아 갈 가치 가 있 는 지 없 는 지,앞에서 소개 한 Supplier 인 터 페 이 스 는 데 이 터 를 생산 하 는 데 사용 되 며,Consumer 인 터 페 이 스 는 데 이 터 를 소비 하 는 데 사용 되 므 로 사용 할 때 범 형 을 지정 하여 매개 변수 유형 을 정의 해 야 합 니 다.

@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
}
사용:입력 한 데 이 터 를 소문 자 출력 으로 통일 합 니 다.

public class ConsumerTest {

    public static void main(String[] args) {
        test(msg -> {
            System.out.println(msg + "->      :" + msg.toLowerCase());
        });
    }

    public static void test(Consumer<String> consumer){
        consumer.accept("Hello World");
    }
}
기본 방법:andThen
만약 에 한 방법의 매개 변수 와 반환 값 이 모두 Consumer 유형 이 라면 효 과 를 실현 할 수 있 습 니 다.한 데 이 터 를 소비 할 때 먼저 조작 을 한 다음 에 하나의 조작 을 해서 조합 을 실현 합 니 다.이 방법 은 바로 Consumer 인터페이스의 default 방법 앤 드 Then 방법 입 니 다.

 default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
구체 적 인 조작

public class ConsumerAndThenTest {

    public static void main(String[] args) {
        test2(msg1->{
            System.out.println(msg1 + "->      :" + msg1.toLowerCase());
        },msg2->{
            System.out.println(msg2 + "->      :" + msg2.toUpperCase());
        });
    }


    public static void test2(Consumer<String> c1,Consumer<String> c2){
        String str = "Hello World";
        //c1.accept(str); //    
        //c2.accept(str); //    
        //c1.andThen(c2).accept(str);
        c2.andThen(c1).accept(str);
    }
}
2.3 Function
반환 값 이 있 는 인터페이스 가 있 습 니 다.Function 인 터 페 이 스 는 한 유형의 데이터 에 따라 다른 유형의 데 이 터 를 얻 는 것 입 니 다.전 자 는 선행 조건 이 라 고 하고 후 자 는 사후 조건 이 라 고 합 니 다.매개 변수 가 있 고 반환 값 이 있 습 니 다.

@FunctionalInterface
public interface Function<T, R> {

    /**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);
}
사용:문자열 에 들 어가 숫자 를 되 돌려 줍 니 다.

public class FunctionTest {

    public static void main(String[] args) {
        test(msg ->{
            return Integer.parseInt(msg);
        });
    }

    public static void test(Function<String,Integer> function){
        Integer apply = function.apply("666");
        System.out.println("apply = " + apply);
    }
}
기본 방법:and Then 도 조합 작업 을 하 는 데 사 용 됩 니 다.

default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

public class FunctionAndThenTest {

    public static void main(String[] args) {
        test(msg ->{
            return Integer.parseInt(msg);
        },msg2->{
            return msg2 * 10;
        });
    }

    public static void test(Function<String,Integer> f1,Function<Integer,Integer> f2){
        /*Integer i1 = f1.apply("666");
        Integer i2 = f2.apply(i1);*/
        Integer i2 = f1.andThen(f2).apply("666");
        System.out.println("i2:" + i2);

    }
}
기본 compose 방법의 작용 순서 와 andThen 방법 은 정반 대 이다
정적 방법 idenity 는 매개 변 수 를 입력 하면 매개 변 수 를 되 돌려 줍 니 다.
2.4 Predicate
참고 및 반환 값 이 Boolean 인 인터페이스 가 있 습 니 다.

@FunctionalInterface
public interface Predicate<T> {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
}
사용:

public class PredicateTest {

    public static void main(String[] args) {
        test(msg -> {
            return msg.length() > 3;
        },"HelloWorld");
    }

    private static void test(Predicate<String> predicate,String msg){
        boolean b = predicate.test(msg);
        System.out.println("b:" + b);
    }
}
Predicate 의 기본 방법 은 논리 적 관계 조작 and or negate isequals 방법 을 제공 합 니 다.

package com.bobo.jdk.fun;

import java.util.function.Predicate;

public class PredicateDefaultTest {

    public static void main(String[] args) {
        test(msg1 -> {
            return msg1.contains("H");
        },msg2 -> {
            return msg2.contains("W");
        });
    }

    private static void test(Predicate<String> p1,Predicate<String> p2){
        /*boolean b1 = predicate.test(msg);
        boolean b2 = predicate.test("Hello");*/
        // b1   H b2   W
        // p1   H    p2   W
        boolean bb1 = p1.and(p2).test("Hello");
        // p1   H    p2   W
        boolean bb2 = p1.or(p2).test("Hello");
        // p1    H
        boolean bb3 = p1.negate().test("Hello");
        System.out.println(bb1); // FALSE
        System.out.println(bb2); // TRUE
        System.out.println(bb3); // FALSE
    }
}
자바 함수 식 인 터 페 이 스 를 어떻게 능숙 하 게 사용 하 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 함수 식 인터페이스 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기