美文网首页
Java8 函数式接口

Java8 函数式接口

作者: 酷酷的小k | 来源:发表于2019-02-28 18:07 被阅读0次

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口可以被隐式转换为 lambda 表达式。

函数式接口实例

Predicate <T> 接口是一个函数式接口,它接受一个输入参数 T,返回一个布尔值结果。

该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。

该接口用于测试对象是 true 或 false。

我们通过Lambda表达式来表示某个接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):

package com.test.java8;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * 函数式接口
 *
 * @author smallk
 * @date 2019/2/28 16:44
 */
public class FunctionalInterfaceTest {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

        System.out.println("输出所有数据");

        // Predicate<Integer> predicate = n -> true
        // n 是一个参数传递到 Predicate 接口的 test 方法
        // n 如果存在则 test 方法返回 true
        eval(list, n -> true);

        System.out.println("输出所有偶数:");
        eval(list, n -> n % 2 == 0);

        System.out.println("输出大于 3 的所有数字:");
        eval(list, n -> n > 3);

        // message -> System.out.println(message) 等价于 System.out::println
        GreetingService greetingService = System.out::println;
        greetingService.sayMessage("你好啊!");
    }

    private static void eval(List<Integer> list, Predicate<Integer> predicate) {
        for (Integer n : list) {
            if (predicate.test(n)) {
                System.out.println(n);
            }
        }
    }

    @FunctionalInterface
    interface GreetingService {

        /**
         * sayMessage
         *
         * @param message String
         */
        void sayMessage(String message);

        /**
         * 函数式接口里允许定义默认方法
         */
        default void doSomeMoreWork() {
            // Method body
        }

        /**
         * 函数式接口里允许定义静态方法
         */
        static void printHello() {
            System.out.println("Hello");
        }

        /**
         * 函数式接口里允许定义 java.lang.Object 里的 public 方法
         *
         * @param obj Object
         * @return boolean
         */
        @Override
        boolean equals(Object obj);
    }
}

关于 @FunctionalInterface 注解

Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。

提醒:加不加 @FunctionalInterface 对于接口是不是函数式接口没有影响,该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法。

函数式接口里允许定义默认方法

函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义。

函数式接口里允许定义静态方法

函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义。

函数式接口里允许定义 java.lang.Object 里的 public 方法

函数式接口里是可以包含 Object 里的 public 方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了 Object 类,包含了来自 java.lang.Object 里对这些抽象方法的实现。

源于:http://www.runoob.com/java/java8-functional-interfaces.html

相关文章

  • JAVA8函数式接口学习

    JAVA8函数式接口 函数式接口是java8的一种新特性,函数式接口定义了且只定义了一个抽象方法!该接口非常有用,...

  • 函数式接口

    函数式接口 声明:java8新特性系列为个人学习笔记,参考地址点击这里,侵删!! 函数式接口(Functional...

  • java8系列-02 函数式接口(Function、Consum

    上一章已经说了函数式接口的基本概念(java8系列-01 Lambdas 表达式)。函数式接口(Functiona...

  • JAVA8新特性之函数式接口使用与学习

    函数式接口 函数式接口是Java8引用的一个新特性,是一种特殊的接口 SAM类型的接口(Single Abstra...

  • Java8值函数式接口

    Java8值函数式接口 如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口 在接口上声明@Functi...

  • java8 lambda

    java8 lambda 函数式接口 谓词 Predicate boolean test(T t); T -...

  • Lambda表达式

    Lambda表达式是Java8的一个新特性,是函数式接口的一种体现。所谓函数式接口(functional inte...

  • 函数式接口(二)

    前面的文章中说明了Java8中最基本的4种函数式接口,我们今天先介绍其它Cosumer函数式接口。 BiConsu...

  • Java 8 新特性 - 函数式接口 Functional In

    Java8的其中一个新特性,函数式接口。 什么是函数式接口?有且仅有一个抽象方法的接口(不包括默认方法、静态方法以...

  • Java8函数式编程之四: 常见的函数式接口及实例

    上一篇博客中Java8函数式编程之三:函数式接口 - 简书留下的问题是关于Consumer接口的,本篇博客就来介绍...

网友评论

      本文标题:Java8 函数式接口

      本文链接:https://www.haomeiwen.com/subject/skjkuqtx.html