一,定义

函数式接口,英文为Functional Interface。首先它是一个接口,那么它与其它接口有什么不同呢?不同点就是在这个接口中只允许有一个抽象方法。

这里的只允许一个抽象方法不包括以下几种情况:
1,函数式接口里面允许有默认方法。我觉得可能是java设计师考虑到默认方法不是抽象的,它有默认实现的方法体。

2,函数式接口里面允许有静态方法。原因和上面相同,静态方法并不能是抽象方法。

3,函数式接口里面允许有java.lang.Object的public方法。可能是因为接口的实现类都继承了java.lang.Object。

package com.czx;

//该注释是在编译期间检查是否为函数式接口
@FunctionalInterface
public interface JDK8Interface { //抽象方法
public boolean isNull(Object o); //java.lang.Object中public方法
public boolean equals(Object obj);
public int hashCode(); //static方法
public static void staticMethod(){
System.out.println("JDK8Interface的静态方法");
} //default方法
public default void defaultMethod(){
System.out.println("JDK8Interface的默认方法");
}
}

注意:如果你想定义一个函数式接口的话,最好把@FunctionalInterface加上,它会在编译期间检测该接口是否为函数式接口。

二,运用

我们可以通过Lambda表达式实现接口的抽象方法,比之前简直简洁太多。之前的方法是写一个实现该接口的类,并写出实现体。具体的不写了,我们看看通过Lambda表达式的代码有多简洁。

package com.czx;

public class Test2 {

    public static void main(String[] args) {
JDK8Interface it = (a) -> a == null; System.out.println(it.isNull(2));//false
System.out.println(it.isNull("mine"));//false
System.out.println(it.isNull(null));//true
}
}

这就结束了,是不是很简单。

三,JDK8中新增的函数式接口

JDK8中引入了java.util.function,此包中内置许多函数式接口,现在将几个常用的函数式接口做说明。

1,Predicate接口

输入一个参数,并返回一个Boolean值,其中内置许多用于逻辑判断的默认方法:

    @Test
    public void predicateTest() {
        Predicate<Integer> predicate = (s) -> s > 0;
        boolean test = predicate.test(2);
        System.out.println("该数字大于0:" + test);         test = predicate.test(0);
        System.out.println("该数字大于0:" + test);         test = predicate.negate().test(0);
        System.out.println("该数字小于等于0:" + test);
    }

2,Function接口

接收一个参数,返回单一的结果,默认的方法(andThen)可将多个函数串在一起,形成复合Funtion(有输入,有输出)结果:

    @Test
    public  void functionTest() {         Function<Integer, Integer> add = (i) -> {
            System.out.println("初始值:" + i);
            return i+1;
        };
        Function<Integer, Integer> power = add.andThen((i) -> {
            System.out.println("第一次运算:" + i);
            return i * i;
        });         Integer res = power.apply(2);
        System.out.println("第二次运算:" + res);
    }

3,Supplier接口

返回一个给定类型的结果,与Function不同的是,Supplier不需要接受参数(供应者,有输出无输入):

    @Test
    public void supplierTest() {
        Supplier<String> supplier = () -> "有输出,无输入。";
        String s = supplier.get();
        System.out.println(s);
    }

4,Consumer接口

代表了在单一的输入参数上需要进行的操作。和Function不同的是,Consumer没有返回值(消费者,有输入,无输出):

    @Test
    public void consumerTest() {
        Consumer<Integer> add = (p) -> {
            System.out.println("old value:" + p);
            p = p + 1;
            System.out.println("new value:" + p);
        };
        add.accept(1);
    }

以上四个接口的用法代表了java.util.function包中四种类型,理解这四个函数式接口之后,其他的接口也就容易理解了。

JDK8新特性:函数式接口的更多相关文章

  1. jdk8新特性--函数式接口的使用

    函数式接口的概念: 函数式接口的格式: 示例: 函数式接口的使用: 简化lambda表达式:

  2. Java8 新特性 函数式接口

    什么是函数式接口   函数式接口是Java8引用的一个新特性,是一种特殊的接口:SAM类型的接口(Single Abstract Method).但是它还是一个接口,只是有些特殊罢了.  函数式接口的 ...

  3. Java8 新特性----函数式接口,以及和Lambda表达式的关系

    这里来讲解一下Java8 新特性中的函数式接口, 以及和Lambda 表达式的关系.看到过很多不少介绍Java8特性的文章,都会介绍到函数式接口和lambda表达式,但是都是分别介绍,没有将两者的关系 ...

  4. java8新特性-函数式接口详细讲解及案例

    一.函数式接口 1.1 概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口.函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 以适 ...

  5. JDK8新特性之接口

    在JDK7及以前的版本中,接口中都是抽象方法,不能定义方法体,但是从jdk8开始,接口中可以定义静态的非抽象的方法,直接使用接口名调用静态方法,但是它的实现类的类名或者实例却不可以调用接口中的静态方法 ...

  6. Java8的新特性--函数式接口

    目录 函数式接口 什么是函数式接口 函数式接口的使用 Java8内置的四大核心函数式接口 一.Consumer:消费型接口(void accept(T t)) 二.Supplier:供给型接口(T g ...

  7. JDK8新特性:接口的静态方法和默认方法

    在jdk8之前,interface之中可以定义变量和方法,变量必须是public.static.final的,方法必须是public.abstract的.由于这些修饰符都是默认的,所以在JDK8之前, ...

  8. JDK8新特性之接口默认方法与静态方法

    接口默认方法与静态方法 有这样一些场景,如果一个接口要添加一个方法,那所有的接口实现类都要去实现,而某些实现类根本就不需要实现这个方法也要写一个空实现,所以接口默认方法就是为了解决这个问题. 接口静态 ...

  9. JDK8新特性 -- Function接口: apply,andThen,compose

    1 Function<T, R>中的T, R表示接口输入.输出的数据类型. R apply(T t) apply: .例子:func是定义好的Function接口类型的变量,他的输入.输出 ...

  10. JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序

    大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...

随机推荐

  1. (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如:  List list = new ArrayList();  list.add(“Hello”);  list.add(“World”);  list.add(“Learn”); //此时list 为Hello World Learn  rever

    import java.util.ArrayList; import java.util.List; public class AA { public static void main(String[ ...

  2. yar 调用rpc方法

    <?php class RpcController extends Yaf_Controller_Abstract { //RPC入口 public function indexAction($ ...

  3. 程序员客栈与DaoCloud这两家企业联手后,运维工程师要失业了!

    2017年1月11日 ,程序员客栈与DaoCloud正式建立合作伙伴关系,为创业企业和团队提供容器应用解决方案.通过与DaoCloud合作,客栈可以更有效地把控开发环节中的不确定因素,解决项目工期不确 ...

  4. 【sqli-labs】 less43 POST -Error based -String -Stacked with tiwst(POST型基于错误的堆叠变形字符型注入)

    和less42一样 login_user=&login_password=1');insert into users(id,username,password) value(15,'root' ...

  5. (转)基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作

    http://www.cnblogs.com/wuhuacong/p/5147368.html 在前面介绍了很多篇相关的<Bootstrap开发框架>的系列文章,这些内容基本上覆盖到了我这 ...

  6. Day 18 hashlib,logging模块

    hashlib 模块 作用:hash是一种算法,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法,该算法接受传入的内容,经过运算得到一串hash值 特点: 1.只要 ...

  7. 对 Lua闭包 知识点的学习的总结 ,在这里和大家分享一下,希望对大家有所帮助

    Lua闭包 --当一个函数内部嵌套另外一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征为词法定界.--闭包是由函数与其相关的引用环境组合而成的实体 闭包=函数+引用环境--不是在局部 ...

  8. 移动端调试 vConsole

    <head> <script src="path/to/vconsole.min.js"></script> <script> va ...

  9. python3使用465端口发送邮件来解决阿里云封闭25端口问题

    import smtplibfrom email.mime.text import MIMETextfrom email.utils import formataddr #发件人邮箱账号my_send ...

  10. javascript实现:在N个字符串中找出最长的公子串

    'use strict' module.exports = function 找出最长公子串 (...strings) { let setsOfSubstrings = [] strings.redu ...