>  기사  >  Java  >  Java 8의 기능적 인터페이스에 대해 무엇을 알아야 합니까?

Java 8의 기능적 인터페이스에 대해 무엇을 알아야 합니까?

PHPz
PHPz앞으로
2023-05-04 18:34:071669검색

    Preface

    Java 8은 함수, 소비자, 공급자, 조건자 등을 포함한 다양한 기능적 인터페이스를 제공합니다. 모두 java.util.function 패키지 아래에 있습니다. java.util.function 包下。

    Java 8의 기능적 인터페이스에 대해 무엇을 알아야 합니까?

    为什么需要知道这几个函数式接口

    因为这 4 个函数式接口是 Java 8 中新增的重要接口,同时 Java 8 的 Stream 新特性,也有用到这些接口,所以学习它们可以帮助我们更好地理解 Stream 流。

    也正因为这是函数式接口,所以就可以使用 Lambda 表达式来写接口的实现逻辑。而且学习的过程中可以更好地理解函数式编程的思想。

    Function 接口

    说明

    Function 这个单词的意思就有「函数」的意思,就数学中的 y = f(x),接收一个 x 参数,通过函数 f 运算后,返回一个结果 y。

    Function 接口包含四个方法:

    • apply(T t):这是 Function 接口的主要方法,它接收一个参数并返回一个结果。同时它也是唯一的抽象的方法,剩下的都是有默认实现的(Java 8 中接口的抽象方法支持默认实现)。

    • andThen(Function after):作用是将两个 Function 组合。首先执行当前函数,再执行 andThen 函数,并将当前函数的结果作为参数传递给 andThen 函数。

    • compose(Function before):同理,将两个 Function 组合,将先执行 compose 函数,再执行当前函数,并将 compose 函数的结果作为参数传递给当前函数。

    • identity(): 返回一个执行恒等转换的函数,即返回输入参数本身。

    Function 接口通常用于将一个类型的值转换为另一个类型的值。

    apply 方法

    // Function 接口的泛型,第一个参数是入参类型,第二个参数是出参类型
    // Function 接口只有一个抽象方法,就是 apply(),下面利用 Lambda 表达式实现这个抽象方法并创建 Function 对象
    Function<Integer, String> function = num -> "GTA" + num;
    // 将5这个参数传递给function,得到返回结果
    String result = function.apply(5);
    System.out.println(result); // 打印:GTA5

    andThen 和 compose 方法

    // 定义两个 Function 对象进行相关转换操作
    Function<String, String> upperCase = s -> s.toUpperCase();
    Function<String, String> addPostfix = s -> s + "5";
    // 链式调用,将 gta 这个字符串参数先传递 upperCase 这个函数进行操作,然后将得到的结果传递给 addPostfix 函数进行操作,得到返回结果
    String str = upperCase.andThen(addPostfix).apply("gta");
    System.out.println(str); // 打印:GTA5

    identify 方法

    identity 方法返回一个执行恒等转换的函数,该函数将输入参数原样返回。例如:

    Function<String, String> identity = Function.identity();
    String result = identity.apply("hello"); // result is "hello"

    Consumer 接口

    说明

    Consumer 这个单词的意思就有「消费者」的意思,就把入参消费了,并不会返回结果给你。

    Consumer 接口包含两个方法:

    • accept(T t):该方法接受一个参数并执行一些操作。

    • andThen(Consumer after):同理,将两个 Consumer 组合,先后进行消费。

    accept 方法

    Consumer 接口通常用于消费一个参数然后执行一些操作。例如:

    // Consumer 接口,泛型参数是入参类型,接受一个参数,并不返回结果,相当于消费了这个参数
    Consumer<String> consumer = s -> System.out.println(s);
    consumer.accept("我输入什么就打印什么"); // 打印:我输入什么就打印什么

    andThen 方法

    组合两个 Consumer:

    Consumer<String> first = s -> System.out.println(s + 5);
    Consumer<String> second = s -> System.out.println(s + 6);
    // 先执行 first 这个 Consumer,接着执行 second 这个 Consumer
    Consumer<String> combination = first.andThen(second);
    combination.accept("GTA"); // 打印:GTA5 GTA6

    Supplier 接口

    Supplier 接口只定义了一个 get() 方法,该方法不接受任何参数并返回一个结果。

    Supplier 这个单词的意思就有「供应者」的意思,给我的感觉就是生产者,不用参数,直接生产一个东西给你。

    Supplier 接口通常用于生成一个值。例如:

    // Supplier 接口,泛型参数是出参类型,不接受参数,但是会提供结果,相当于生产了某个东西
    Supplier<String> supplier = () -> "提供一个我随便打的字符串给调用方";
    String text = supplier.get();
    System.out.println(text); // 打印:提供一个我随便打的字符串给调用方

    Predicate 接口

    说明

    Predicate 这个单词的意思就有「预言,预测,谓语,谓词」的意思,就是用来预测判断的。

    Predicate 接口包含四个方法:

    • test(T t):该方法接受一个参数并返回一个布尔值

    • and(Predicate other):与另一个 Predicate 进行组合,实现逻辑与操作。

    • negate():与另一个 Predicate 进行组合,实现逻辑非操作。

    • or(Predicate other)Java8에서 알아야 할 기능적 인터페이스는 무엇입니까

      이러한 기능적 인터페이스를 알아야 하는 이유
    이 4가지 기능적 인터페이스는 Java 8의 새로운 중요한 인터페이스이기 때문에

    동시에 Java 8의 새로운 Stream 기능도 이러한 인터페이스를 사용합니다

    . 따라서 이를 학습하면 더 나은 도움이 될 수 있습니다. 스트림 스트림에 대한 좋은 이해.

    기능적 인터페이스이므로 Lambda 표현식을 사용하여 인터페이스의 구현 로직을 작성할 수 있습니다. 그리고 학습 과정에서 함수형 프로그래밍의 아이디어를 더 잘 이해할 수 있습니다.

    함수 인터페이스

    설명

    함수는 "함수"를 의미합니다. 수학에서 y = f(x)는 x 매개변수를 받고 함수 f에 의해 연산된 후 결과 y를 반환합니다.

    Function 인터페이스에는 네 가지 메소드가 포함되어 있습니다:

    apply(T t): 이는 입니다. 함수 매개변수를 받고 결과를 반환하는 인터페이스의 기본 메서드입니다. 동시에 이는 유일한 추상 메소드이기도 하며 나머지는 기본 구현을 갖습니다(Java 8 인터페이스의 추상 메소드는 기본 구현을 지원합니다).

  • andThen(Function after): 두 개의 함수를 결합하는 함수입니다. 먼저 현재 함수를 실행한 다음 andThen 함수를 실행하고 현재 함수의 결과를 andThen 함수에 매개변수로 전달합니다.

  • compose(Function before): 마찬가지로 두 개의 Function이 결합되면 compose 함수가 실행됩니다. 먼저 현재 함수를 선택하고 compose 함수의 결과를 매개변수로 현재 함수에 전달합니다.

  • identity(): 항등 변환을 수행하는 함수, 즉 입력 매개변수 자체를 반환합니다.

    함수 인터페이스는 일반적으로 한 유형의 값을 다른 유형의 값으로 변환하는 데 사용됩니다. apply 메소드

    // Predicate 接口,泛型参数是入参类型,返回布尔值
    Predicate<String> predicate = s -> s.contains("god23bin");
    boolean flag = predicate.test("god23bin能给你带来收获吗?");
    System.out.println("god23bin能给你带来收获吗?" + flag); // 打印:god23bin能给你带来收获吗?true
    🎜andThen 및 compose 메소드🎜
    Predicate<String> startsWithA = (str) -> str.startsWith("A"); // 如果传入的字符串是A开头,则返回 true
    Predicate<String> endsWithZ = (str) -> str.endsWith("Z"); // 如果传入的字符串是Z结尾,则返回 true
    🎜identify 메소드🎜🎜identity 메소드는 ID 변환을 수행하는 함수를 반환하며, 이는 입력 매개변수를 변경하지 않고 반환합니다. 예: 🎜
    Predicate<String> startsWithAAndEndsWithZ = startsWithA.and(endsWithZ);
    System.out.println(startsWithAAndEndsWithZ.test("ABCDEFZ")); // true
    System.out.println(startsWithAAndEndsWithZ.test("BCDEFGH")); // false
    🎜Consumer 인터페이스 🎜🎜 설명 🎜🎜Consumer는 "소비자"를 의미하며 입력 매개변수를 사용하고 결과를 반환하지 않습니다. 🎜🎜Consumer 인터페이스에는 두 가지 메소드가 포함되어 있습니다. 🎜
    • 🎜accept(T t): 이 메소드는 매개변수를 승인하고 일부 작업을 수행합니다. 🎜🎜
    • 🎜andThen(Consumer after): 같은 방식으로 두 개의 Consumer를 결합하여 차례로 소비합니다. 🎜🎜🎜🎜accept 메서드 🎜🎜소비자 인터페이스는 일반적으로 매개변수를 사용하고 일부 작업을 수행하는 데 사용됩니다. 예: 🎜
      Predicate<String> notStartsWithA = startsWithA.negate();
      System.out.println(notStartsWithA.test("ABCDEF")); // false
      System.out.println(notStartsWithA.test("BCDEFGH")); // true
      🎜andThen 메소드 🎜🎜는 두 개의 소비자를 결합합니다. 🎜
      Predicate<String> startsWithAOrEndsWithZ = startsWithA.or(endsWithZ);
      System.out.println(startsWithAOrEndsWithZ.test("ABCDEF")); // true
      System.out.println(startsWithAOrEndsWithZ.test("BCDEFGH")); // false
      🎜Supplier 인터페이스 🎜🎜Supplier 인터페이스는 매개변수를 허용하지 않고 결과를 반환하는 하나의 get() 메소드만 정의합니다. 🎜🎜Supplier 이 단어는 "공급자"를 의미합니다. 매개 변수 없이 직접 무언가를 생산하는 생산자라는 느낌을 줍니다. 🎜🎜Supplier 인터페이스는 일반적으로 값을 생성하는 데 사용됩니다. 예: 🎜
      // map 方法,将 T 类型的值转换成 R 类型的值
      // R 是返回的 Stream 流的元素类型,T 是原先 Stream 流的元素类型
      <R> Stream<R> map(Function<? super T, ? extends R> mapper);
      🎜Predicate 인터페이스🎜🎜Explanation🎜🎜Predicate 이 단어는 "예언, 예측, 술어, 술어"를 의미하며 예측과 판단에 사용됩니다. 🎜🎜Predicate 인터페이스에는 네 가지 메소드가 포함되어 있습니다: 🎜
      • 🎜test(T t): 이 메소드는 매개변수를 허용합니다. 🎜부울 값🎜을 반환합니다. 🎜🎜
      • 🎜and(Predicate other): 다른 조건자와 결합하여 🎜논리적 및🎜연산을 구현합니다. 🎜🎜
      • 🎜negate(): 다른 조건자와 결합하여 🎜논리적 부정🎜 연산을 구현합니다. 🎜🎜
      • 🎜or(다른 술어): 다른 술어와 결합하여 🎜논리적 또는 🎜연산을 구현합니다. 🎜🎜🎜🎜테스트 방법🎜🎜Predicate 인터페이스는 일반적으로 조건이 참인지 테스트하는 데 사용됩니다. 예: 🎜
        // forEach 方法,遍历 Stream 流中的元素,T 类型是 Stream 流的元素类型
        void forEach(Consumer<? super T> action);
        🎜and method🎜🎜시연의 편의를 위해 여기에는 두 개의 술어가 준비되어 있습니다. 🎜
        // 生成一个无限长度的 Stream 流
        public static<T> Stream<T> generate(Supplier<T> s) {
            Objects.requireNonNull(s);
            return StreamSupport.stream(
                new StreamSpliterators.InfiniteSupplyingSpliterator.OfRef<>(Long.MAX_VALUE, s), false);
        }
        🎜and의 조합에 사용, 🎜with 🎜작동: 🎜
        // 过滤出 Stream 流中,判断结果为 true 的元素
        Stream<T> filter(Predicate<? super T> predicate);
        🎜negate 메서드🎜🎜조합에 negate 사용, 🎜Non🎜 작업: 🎜 rrreee🎜or 메서드 🎜🎜는 or를 사용하여 🎜 또는 🎜 작업을 수행합니다. 🎜rrreee🎜그러면 이러한 인터페이스의 응용 프로그램은 무엇입니까? 🎜🎜🎜이러한 기능적 인터페이스는 스트림 스트림에 적용됩니다. 🎜물론 비슷한 요구 사항이 있는 경우 이러한 인터페이스를 직접 적용할 수도 있습니다. 스트림 흐름의 응용 프로그램에 대해 이야기해 보겠습니다. 🎜

        Function 接口:例如 map 方法,map 方法就是将一个类型的值转换为另一个类型的值。

        // map 方法,将 T 类型的值转换成 R 类型的值
        // R 是返回的 Stream 流的元素类型,T 是原先 Stream 流的元素类型
        <R> Stream<R> map(Function<? super T, ? extends R> mapper);

        Consumer 接口:例如 forEach 方法

        // forEach 方法,遍历 Stream 流中的元素,T 类型是 Stream 流的元素类型
        void forEach(Consumer<? super T> action);

        Supplier 接口:例如 generate 方法

        // 生成一个无限长度的 Stream 流
        public static<T> Stream<T> generate(Supplier<T> s) {
            Objects.requireNonNull(s);
            return StreamSupport.stream(
                new StreamSpliterators.InfiniteSupplyingSpliterator.OfRef<>(Long.MAX_VALUE, s), false);
        }

        Predicate 接口:例如 filter 方法,使用 Predicate 进行过滤操作。

        // 过滤出 Stream 流中,判断结果为 true 的元素
        Stream<T> filter(Predicate<? super T> predicate);
  • 위 내용은 Java 8의 기능적 인터페이스에 대해 무엇을 알아야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제