상용 함수식 인터페이스

12370 단어

상용 함수식 인터페이스

  • 추상적인 방법만 포함된 인터페이스
  • 이 인터페이스는 항상 Lambda 표현식과 연결된다
  • Lambda 표현식의 로드 지연으로 성능 낭비 방지
  • Supplier - 프로덕션 인터페이스

  • java.util.function.Supplier 인터페이스에는 일반 매개변수가 지정한 유형의 객체 데이터를 가져오는 데 사용되는 참조 없는 방법인 T get()만 포함됩니다.이것은 함수식 인터페이스이기 때문에 대응하는 Lambda 표현식에 대외적으로 범용 유형에 맞는 대상 데이터를 제공해야 한다는 것을 의미한다.
  • Supplier<>인터페이스는 생산형 인터페이스라고 하는데 인터페이스의 범위가 어떤 유형인지 지정하면 인터페이스의 get 방법은 어떤 유형의 데이터를 생산하고 되돌아오는 값이 있다.
  • package cn.learn;
    
    import java.util.function.Supplier;
    
    public class function {
        // , Supplier<> , String.get String
        public static String getString(Supplier stringSupplier){
            return stringSupplier.get();
        }
    
        public static void main(String[] args) {
            // getString , , lambda 
            String str = getString(() ->{
               // , 
               return "aaa"; 
            });
    
            System.out.println(str);
    
            // Lambda 
            str = getString(() -> "aaa");
    
            System.out.println(str);
            
        }
    }
    

    연습:배열 요소 최대값 구하기

    package cn.learn;
    
    import java.util.function.Supplier;
    
    public class function {
        public static Integer getMax(Supplier stringSupplier){
            return stringSupplier.get();
        }
    
        public static void main(String[] args) {
            // 
            int[] arr = new int[]{3,55,66,77,88,-5};
    
            // getMax , Lambda 
            int integermax = getMax(() ->{
               // 
               int max = arr[0];
                for (int i = 1; i < arr.length; i++) {
                    if (max < arr[i]){
                        max = arr[i];
                    }
                }
                return max;
            });
    
            /******
            // getMax 
            getMax(new Supplier() {
                @Override
                public Integer get() {
                    // 
                    int max = arr[0];
                    for (int i = 1; i < arr.length; i++) {
                        if (max < arr[i]) {
                            max = arr[i];
                        }
                    }
                    return max;
                }
            });
            *******/
    
            System.out.println(integermax);
        }
    }
    

    Consumer - 소비자용 커넥터

  • java.util.function.Consumer 인터페이스는 Supplier 인터페이스와 반대로 하나의 데이터를 생산하는 것이 아니라 하나의 데이터를 소비하고 그 데이터 유형은 범주에 의해 결정된다
  • Consumer 인터페이스에는 추상적인 방법인 void accept(Tt)가 포함되어 있으며, 지정된 일반적인 데이터를 소비하고 반환값이 없음
  • package cn.learn;
    
    import java.util.function.Consumer;
    
    public class function {
        //accept 、 
        public static void print(Integer year,Consumer age){
            age.accept(year);
        }
    
        public static void main(String[] args) {
    
            // : 
            print(2018,(year) -> System.out.println(" "+year));
    
            // : 
            print(2018,(year) -> {
                String string = year.toString();
                String re = new StringBuilder(string).reverse().toString();
                System.out.println(re);
            });
        }
    }
    
  • Consumer 방법의 기본 방법인 andThen
  • 만약에 한 방법의 매개 변수와 반환값이 모두Consumer 유형이라면 실현할 수 있다. 데이터를 소비할 때 먼저 조작을 한 다음에 조작을 해서 조합을 실현한다. 이 방법은Consumer 인터페이스의default 방법
  • 이다.
  • JDK 소스
  •    default Consumer andThen(Consumer super T> after) {
            Objects.requireNonNull(after);
            return (T t) -> { accept(t); after.accept(t); };
        }

    주:java.util.Object의 Require Nonnull 정적 방법은 파라미터가null일 때 자발적으로 NullPointer Exception 이상을 던집니다.if문장을 작성하고 빈 바늘을 던질 때의 번거로움을 줄일 수 있습니다.
  • 조합 효과를 실현하려면 두 개의 Lambda 표현식이 필요하지만 andThen의 의미는 바로'한 걸음 한 걸음'작업이다. 예를 들어 두 단계의 조합 경우:
  • Consumer con1; Consumer con2; String str = "hello"; con1.accept(str); con2.accept(str);

  • 
    package cn.learn;
    
    import java.util.function.Consumer;
    
    public class function {
        // Consumer , 
        public static void method(String str,Consumer con1,Consumer con2){
            
            // 
            con1.accept(str);
            con2.accept(str);
            
        }
    
        public static void main(String[] args) {
            
            // , method , Lambda 
            method("Hello",(str) -> {
                // : 
                System.out.println(str.toUpperCase());
            },(str) ->{
                // : 
                System.out.println(str.toLowerCase());
            });
            
        }
    }
    
  • 두 인터페이스를 연결하여 소비(누가 앞서고 누가 먼저 소비)하면con1로 바꿀 수 있다.andThen(con2).accept(str);
  • package cn.learn;
    
    import java.util.function.Consumer;
    
    public class function {
        //andThen Consumer , Consumer , 
        public static void method(String str,Consumer con1,Consumer con2){
            
            // con1 , con2
            con1.andThen(con2).accept(str);
    
        }
    
        public static void main(String[] args) {
    
            // , method , Lambda 
            method("Hello",(str) -> {
                // : 
                System.out.println(str.toUpperCase());
            },(str) ->{
                // : 
                System.out.println(str.toLowerCase());
            });
    
        }
    }
    

    연습:인쇄 정보 서식 적용

    package cn.learn;
    
    import java.util.function.Consumer;
    
    public class function {
        // Consumer , 
        public static void method(String[] str,Consumer con1,Consumer con2){
    
            // con1 , con2
            con1.andThen(con2).accept(str);
    
        }
    
        public static void main(String[] args) {
    
            // 
            String[] person ={" , "," , "};
    
            // , method , Lambda 
            method(person,(str) -> {
                // : 
                for (String name:str) {
                    // 
                    System.out.println(name.split(",")[0]);
                }
            },(str) ->{
                // : 
                for (String name:str) {
                    // 
                    System.out.println(name.split(",")[1]);
                }
            });
        }
    }
    

    결과: 왕 군 남녀
  • 다른 쓰기
  • package cn.learn;
    
    import java.util.function.Consumer;
    
    public class function {
        // Consumer , 
        public static void method(String[] str,Consumer con1,Consumer con2){
            // , 
            for (String message:str) {
                // con1 , con2
                con1.andThen(con2).accept(message);
            }
    
    
        }
    
        public static void main(String[] args) {
    
            // 
            String[] person ={" , "," , "};
    
            // , method , Lambda 
            method(person,(message) -> {
                // : 
                    System.out.println(message.split(",")[0]);
            },(message) ->{
                // : 
                    System.out.println(message.split(",")[1]);
            });
        }
    }
    

    결과: 왕 군 남 왕 녀

    Predicate - 판단 인터페이스

  • 때때로 우리는 특정한 데이터 유형의 데이터를 판단하여 boolean 값의 결과를 얻어야 할 때java를 사용할 수 있다.util.function.predicate 커넥터
  • Predicate 인터페이스에는 boolean test(T t)라는 추상적인 방법이 포함되어 있습니다.조건 판단에 사용되는 장면, 반환값은 볼값
  • ```java package cn.learn;
    import java.util.function.Predicate;
    public class function {//public static boolean checkMethod(String str, Predicate pre){ return pre.test(str); }
    public static void main(String[] args) {
    
        String str = "hello"; 
    
        // 
        boolean check = checkMethod(str,(String str01) ->{
           return str01.length()>5;
        });
    
        boolean check1 = checkMethod(str,str01 -> str01.length()>3);
    
        System.out.println(check);
        System.out.println(check1);
    }

    }
  • 기본 방법: and - 여러 판단 조건과'&&'의 차이가 많지 않음
  • package cn.learn;
    
    import java.util.function.Predicate;
    
    public class function {
        //
        public static boolean checkMethod(String str, Predicate pre1, Predicate pre2){
            // return pre1.test(str) && pre2.test(str);
            return pre1.and(pre2).test(str);
        }
    
        public static void main(String[] args) {
    
            String str = "hello";
    
            // 
            boolean check = checkMethod(str,(String str01) ->{
               return str01.length()>3;
            },(str01) ->{
                return str01.contains("1");
            });
    
    
            System.out.println(check);
        }
    }
    

    false
  • 기본 방법: or - 여러 판단 조건과 "||"의 차이를 판단할 수 있음
  • package cn.learn;
    
    import java.util.function.Predicate;
    
    public class function {
        //
        public static boolean checkMethod(String str, Predicate pre1, Predicate pre2){
            // return pre1.test(str) || pre2.test(str);
            return pre1.or(pre2).test(str);
        }
    
        public static void main(String[] args) {
    
            String str = "hello";
    
            // 
            boolean check = checkMethod(str,(String str01) ->{
               return str01.length()>3;
            },(str01) ->{
                return str01.contains("1");
            });
    
    
            System.out.println(check);
        }
    }
    

    true
  • 기본 방법:negate - 여러 판단 조건과 "!"를 판단할 수 있습니다.차이가 많지 않다
  • 
    package cn.learn;
    
    import java.util.function.Predicate;
    
    public class function {
        //
        public static boolean checkMethod(String str, Predicate pre1){
            // return !pre1.test(str);
            return pre1.negate().test(str);
        }
    
        public static void main(String[] args) {
    
            String str = "hello";
    
            // 
            boolean check = checkMethod(str,(String str01) ->{
               return str01.length()>3;
            });
    
    
            System.out.println(check);
        }
    }
    

    false

    연습:컬렉션 정보 필터링

  • 이름이 두 글자이고 여자의 문자열을 집합에 선택하려면 문자열 판단에 equals 방법
  • 이 필요합니다.
    package cn.learn;
    
    import java.util.ArrayList;
    import java.util.function.Predicate;
    
    public class function {
    
        public static ArrayList filter(String[] str, Predicate pre1, Predicate pre2) {
    
            // , 
            ArrayList correct = new ArrayList<>();
            // 
            for (String message : str) {
                boolean ifCorr = pre1.and(pre2).test(message);
                // 
                if (ifCorr) {
                    correct.add(message);
                }
            }
            return correct;
    
        }
    
        public static void main(String[] args) {
    
            String[] str = {" , ", " , ", " , ", " , "};
    
            // , 
            ArrayList list = filter(str, (String str01) -> {
                return str01.split(",")[0].length() == 2;
            }, (str01) -> str01.split(",")[1].equals(" ") );
    
    
            System.out.println(list);
        }
    }
    

    [왕 군, 녀]

    Function - 데이터 유형 변환 인터페이스

  • java.util.function.Function 인터페이스는 한 데이터 유형에 따라 다른 데이터 유형을 얻는 데 사용되는데 전자는 선행 조건이고 후자는 후행 조건이다.
  • 추상적인 방법: apply, R apply, 유형 T의 매개 변수에 따라 R형의 결과를 얻고 다른 유형의 값을 되돌려준다.
  • package cn.learn;
    
    
    import java.util.function.Function;
    
    public class function {
    
        public static Integer convert(String str, Function function){
            // Integer 
            return function.apply(str);
        }
    
        public static void main(String[] args) {
            String str = "2018";
            // convert , Lambda apply 
            Integer strInt = convert(str,(String str01) ->{
               return  Integer.parseInt(str01);
            });
    
            System.out.println(strInt);
        }
    }
    
  • 기본 방법: andThen, 조합 작업에 사용
  • 요구: 문자열을 Integer 형식으로 변환하고 결과를 연산한 다음에 정형을 변환
  • package cn.learn;
    
    
    import java.util.function.Function;
    
    public class function {
    
        public static String convert(String str, Function fun1,Function fun2){
            // String 
            return fun1.andThen(fun2).apply(str);
        }
    
        public static void main(String[] args) {
            String str = "2018";
            // convert , , String
            str = convert(str,str01 ->Integer.parseInt(str01)+10,int01 -> int01.toString());
            System.out.println(str);
        }
    }
    

    2028

    좋은 웹페이지 즐겨찾기