文档章节

JAVA8新特性之:函数式接口

落叶追风
 落叶追风
发布于 2016/12/07 10:14
字数 838
阅读 45
收藏 3
点赞 0
评论 0

什么是函数式接口(Functional Interface)

所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法

这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。

函数式接口用途

它主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。

如定义了一个函数式接口如下:

    @FunctionalInterface
    interface GreetingService 
    {
        void sayMessage(String message);
    }

使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):

GreetingService greetService1 = message -> System.out.println("Hello " + message);

关于@FunctionalInterface注解

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

正确例子,没有报错

    @FunctionalInterface
    interface GreetingService
    {
        void sayMessage(String message);
    }

错误例子,接口中包含了两个抽象方法,违反了函数式接口的定义,Eclipse报错提示其不是函数式接口。

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

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

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

如下代码不会报错:

    @FunctionalInterface
    interface GreetingService
    {
        void sayMessage(String message);

        default void doSomeMoreWork1()
        {
            // Method body
        }

        default void doSomeMoreWork2()
        {
            // Method body
        }
    }

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

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

如下代码不会报错:

    @FunctionalInterface
    interface GreetingService 
    {
        void sayMessage(String message);
        static void printHello(){
            System.out.println("Hello");
        }
    }

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

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

如下代码不会报错:

    @FunctionalInterface
    interface GreetingService  
    {
        void sayMessage(String message);
        
        @Override
        boolean equals(Object obj);
    }

JDK中的函数式接口举例

java.lang.Runnable,

java.awt.event.ActionListener, 

java.util.Comparator,

java.util.concurrent.Callable

java.util.function包下的接口,如Consumer、Predicate、Supplier等

函数式接口用法举例

没有任何参数的函数式接口 
Display.java

package us.suselinks.learningjava8;

@FunctionalInterface
public interface Display {

    void show();
}

包含一个参数的函数式接口 
Circle.java

package us.suselinks.learningjava8;

@FunctionalInterface
public interface Circle {

    double area(double radius);
}

包含两个参数的函数式接口 
Adder.java

package us.suselinks.learningjava8;

@FunctionalInterface
public interface Adder {

    int add(int number1, int number2);
}

测试函数式接口

FunctionalInterfaceDemo.java

package FunctionalInterfaceDemo;

import us.suselinks.learningjava8.Adder;
import us.suselinks.learningjava8.Circle;
import us.suselinks.learningjava8.Display;

public class FunctionalInterfaceDemo {

    public static void main(String[] args) {
        // 没有任何参数的函数式接口
        Display display = () -> System.out.println("showed up");
        display.show();

        // 包含一个参数的函数式接口
        Circle circle = (num) -> Math.PI * num * num;
        double res = circle.area(5.0);
        System.out.println(res);
        // 包含两个参数的函数式接口
        Adder adder = (int a, int b) -> a + b;
        int rs = adder.add(15, 20);
        System.out.println(rs);

    }
}
输出:
showed up
78.53981633974483
35

 

© 著作权归作者所有

共有 人打赏支持
落叶追风
粉丝 1
博文 12
码字总数 6526
作品 0
程序员
Java8新特性系列(Interface)

在Java8版本以前,Interface接口中所有的方法都是和,那么在Java8中,Interface有什么新特性呢? 静态成员 在Java8以前,我们要定义一些常量,一般会写一个类,类中都是的一些变量,如下: ...

码上论剑 ⋅ 02/03 ⋅ 0

Java8 学习笔记

先来一个概览,上图是我整理的Java8中的新特性,总的来看,大致上可以分成这么几个大块。 函数式接口 所谓的函数式接口就是只有一个抽象方法的接口,注意这里说的是抽象方法,因为Java8中加入...

xrzs ⋅ 2013/05/14 ⋅ 0

JAVA 8 新特性 (值得学习)

JAVA 8 已经出现好长时间了,大的互联网公司很多都已经使用了,甚至很多知名互联网公司踩过很多坑,也有一些大牛分享出了他们的实战经验。去很多知名的互联网公司经常会被面试官问,你了解j...

豆芽菜橙 ⋅ 2017/08/20 ⋅ 0

利用java8新特性实现类似javascript callback特性

Java8的新特性之一,就是首次引入了函数式编程Lambda表达式,按oracle的说法,是为了引导java向函数式编程的方向发展。 在JDK1.8中,多了一个包,java.util.function,这里主要用到了这个包下...

Acce1erator ⋅ 2015/12/02 ⋅ 3

Java 8 新特性初探

前言 网上说,Java 8 或许是迄今最令人期待的新版本,因为开发者为其注入许多振奋人心的新特性。目前,Java 8 稳定版本已经发布,许多IDE(IntelliJ、Eclipse等)也纷纷支持Java 8 的新特性。...

fonoisrev ⋅ 2014/03/20 ⋅ 0

java8的新特性

java8出来好长一段时间了但是一直都没什么机会在项目中使用。今晚有时间就了下 总结了下。 特性1:Lambda 表达式 老版本是这个样子的排序 新版本 二 函数式接口 每一个lambda表达式都对应一个...

天使broken ⋅ 2015/10/26 ⋅ 2

Java的Lambda表达式

Lambda表达式是java8的新特性,支持代码块作为方法参数,相当于Lambda表达式代替匿名内部类创建对象Lambda代码块将会代替实现抽象方法的方法体,lambda表达式就相当于一个匿名的方法。 1.La...

西红柿的眼泪 ⋅ 2016/07/09 ⋅ 0

Java 8新特性(二)

集合类的批处理: Java8除了Lambda表达式外还提供了另一个重要的特性,即集合的批处理操作,集合类的批处理操作API的目的是实现集合类的“内部迭代”,并期望充分利用现代多核CPU进行并行计算...

casoc ⋅ 2015/06/02 ⋅ 0

Collection及其师傅Iterable

上一节我们缕清了Collection家族的关系,接下来我们就来看看这个家族的创始者及其师傅。 1. 师傅Iterable Iterable是一个接口类,先看看接口里面的方法: 其中第二个和第三个方法,都是java8...

村上扼罢 ⋅ 2016/05/26 ⋅ 0

Java8新特性系列(引用)

上期我们分析了Java8中的Lambda表达式,本期我们将分析Java8中的引用。 一、方法引用 定义 若Lambda体中的功能,已经有方法提供实现,可以使用方法引用,可以将方法引用理解为Lambda 表达式的...

码上论剑 ⋅ 02/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 47分钟前 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部