Java 8 中函数接口,陈货翻新了炒,只是为了Lambda表达式

Java开发人员应该对java.lang.Runnable,java.util.Comparator,java.util.concurrent.Callable
等等接口不会感到陌生。他们都只有一个单一的抽象方法。这样的接口,我们通常叫单一抽象方法接口(SAM,Single Abstract Method Interface)。

以前大家应该经常使用下面的代码片段

public class InnerAnonymousClassSample {

    public static void main(String[] args){

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Anonymous Class Thread Demo");
            }
        }).start();

    }}

在Java 8
中,对于这种拥有单一抽象方法的接口,换了个名字,叫函数接口。所以,这个不是什么新东西,这个名字也是为了Lambada表达式而生。还是拿Runnable来说事,看看和Lambda表达式合壁后的结果。

public class ThreadWithLambda {

    public static void main(String[] args){
        new Thread(() -> System.out.println("Thread with Lambda expression Demo")).start();

    }
}

回到函数接口上来,Java引入了@FunctionalInterface注解。用了它,你定义的接口就得是只有一个抽象方法的函数接口,否则会报编译错误。

@FunctionalInterface
public interface FunInterfaceAnnotationDemo {

        public void absMethodDemo();
        public void absMoreMethodDemo();

}
Error:(8, 1) java: 意外的 @FunctionalInterface 注释
        com.tr.learning.lambda.FunInterface.FunInterfaceAnnotationDemo 不是函数接口
        在 接口 com.tr.learning.lambda.FunInterface.FunInterfaceAnnotationDemo 中找到多个非覆盖抽象方法

上述方法可以通过Java 8中引入的关键字default 在接口中为其中一个抽象方法指定一个默认实现,这样上述接口就会变成合法的函数接口了。

@FunctionalInterface
public interface FunInterfaceAnnotationDemo {

        public void absMethodDemo();
        default public void absMoreMethodDemo(){
            System.out.println("Default implementation of method ininterface");
        }

一旦有了default
关键字,现在的接口就好像变成了抽象类。这让人总觉得怪怪的。这个default的接口主要是为了向后兼容。当你往一个拥有众多子类的接口中添加方法时,你总不想一个子类一个子类的去把方法实现吧?这在Java
JDK不断升级的过程中,是一个很现实的问题。至于说使用带default实现的接口还是抽象类,我认为在进行Java代码的设计时,还是抽象类更合适。

时间: 2024-10-10 12:22:29

Java 8 中函数接口,陈货翻新了炒,只是为了Lambda表达式的相关文章

java调用matlab函数接口的两种方案

Java 调用matlab 函数接口 Java调用matlab函数接口有两种方式: l 一种是通过matlab把函数打成jar包: l 一种是把matlab编译成dll后,用C++再封装成java能支持的数据类型的dll. 注意:不论用这两种方式中的哪一种,最终部署时都需要matlab环境(MCR,在matlab安装路径下有). 1. 方式一:matlab直接打jar包 1.1. 利用matlab自带工具打jar包 1.1.1. 建立jar包 在matlab的Commond Window中输入d

java学习中,接口的使用(重要,常用知识点)(java 学习中的小记录)

java学习中,接口的使用(重要,常用知识点)(java 学习中的小记录)作者:王可利(Star·星星) 接口(功能:用来添加拓展功能的) 例子:铅笔.带橡皮檫的铅笔. 两个功能:     1.写字......> 铅笔     2.擦字......> 橡皮擦 想法:定义一个铅笔类,定义一个橡皮擦类,定义一个带橡皮擦的铅笔类继承 铅笔类和橡皮擦类 但是java是单继承的.于是就有了解决的方法:接口(可以添加拓展功能) 如:一个铅笔类,给它添加一个接口给它一个拓展类(橡皮擦类) 接口的定义模式 用

漫谈Java程序设计中的接口应用

Java语言提供了一种接口(interface)机制.这种接口机制使Java的面向对象编程变得更加灵活.我们可以用接口来定义一个类的表现形式,但接口不能包含任何实现.在<Thinking in Java>一书中,作者对接口有这样的描述:“接口(interface)比抽象(abstract)的概念更进了一步.你可以把一个接口看成是一个纯的抽象类.”我认为作者对接口的这一解释再准确不过了. 理解并用好接口机制将帮助我们更好的掌握Java这种面向对象的编程语言.下面我们来讨论一下接口的使用规则以及相

java类中定义接口

今天看到一个java类中定义了接口,写个备忘录,记录一下 1 package com.gxf.test; 2 3 public class Test_interface { 4 public interface show{ 5 public void show(); 6 } 7 static class TestInterface implements show{ 8 9 @Override 10 public void show() { 11 System.out.println("this

Java 8中如何使用ASM和JiteScript“烘焙”你自己的lambda

呃,Java字节码.我们已经在理解Java字节码一文中已经讨论过,但继续加深下记忆吧:Java字节码是源代码的二进制表示,JVM可以读取和执行字节码. 现在Java中广泛使用字节码库,尤其Java EE中普遍用到运行时的动态代理生成.字节码转换也是常见用例,比如支持AOP运行时织入切面,或JRebel等工具提供的可扩展类重载技术.在代码质量领域,常使用库解析和分析字节码. 如果要转换类字节码,有很多字节码库可供选择,其中最常用的有ASM,Javassist和BCEL.本文将简单介绍ASM和Jit

Java集合中Map接口的使用方法

Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值. Map支持泛型,形式如:Map<K,V> Map中使用put(K key,V value)方法添加 HashMap类 HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现

Java基础中map接口和实现类

1.Map接口常用的实现类有HashMap和TreeMap. 2.HashMap类实现的Map集合对于添加和删除映射关系效率更高.HashMap是基于哈希表的Map接口的实现,HashMap通过哈希码对其内部的映射关系进行快速查询,由HashMap类实现的Map集合对于添加或删除映射关系效率较高. 3.TreeMap中的映射关系存在一定的顺序,如果希望Map集合中的对象存在一定的顺序,该使用TreeMap类实现Map集合. HashMap类 ①此类不保证映射的顺序,特别是不保证该顺序恒久不变 ②

Java Listener中Spring接口注入的使用

在项目中使用Spring通常使用他的依赖注入可以很好的处理,接口与实现类之间的耦合 性,但是通常的应用场景中都是Service层和DAO层,或者web层的话, 也是与Strust2来整合,那么如何在Listener中使用Spring自动注入的接口呢. 接下来开始记录下今天做的一个小工具. 这个小工具是通过这个Listener来开启一个线程, 然后定时访问数据库中的数据,将数据获取出来后,然后逐条分析数据里边的手机号码,来通过淘宝提供的一个接口来分析手机号的归属地.那么在Listener中如何来访

java语言中的接口概述

接口 接口中的成员修饰符是固定的 1,全局常量:public staticfinal 2,抽象方法:public abstract 接口中的成员都是公共的权限. 类与类之间是继承关系,类与接口之间是实现关系. 接口不可以实例化 只能有实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化.否则,这个子类就是一个抽象类. 调用接口的常量时,接口名,接口的子类名,子类的对象都可以进行调用. 在java中不直接支持多继承,因为会出现调用的不确定性. 所以java将多继承机制进行改良,在ja