Lambda表达式的使用

练习:

  • 定义一个接口flyable,里面定义一个抽象方法 void fly(String s)
  • 定义一个测试类flyabledemo,在测试类中提供两个方法

一个方法是useFlyable(Flyable f)

主方法,在主方法中调用useflyable方法

package Demo16;
public interface Flyable {
    void fly(String s );
}
package Demo16;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
public class FlyableDemo {
    public static void main(String[] args) {
        useFlyable(new Flyable() {
            @Override
            public void fly(String s) {
                System.out.println(s);
                System.out.println("飞机自驾游");
            }
        });
        System.out.println("----------------");
        useFlyable( (String s ) -> {
            System.out.println(s);
            System.out.println("飞机自驾游");
        });
    }
    private  static void useFlyable(Flyable f){
        f.fly("风和日丽,晴空万里");
    }
}

练习2

  • 定义一个接口(Addable),里面定义一个抽象方法, int add(int x ,int y)
  • 定义一个测试类(AddableDemo),在测试类中提供两个方法

一个方法是:useAddable(Addable)

一个主方法是,在主方法中调用useAddable方法

package Demo17;
public interface Addable {
    int add(int x ,int y);
}
package Demo17;

public class AddableDemo {
    public static void main(String[] args) {
//在主方法中调用useAddable方法
        useAddable( (int x ,int y ) ->{
            return  x y;//简化重写方法可以看做
        });
    }
    private  static void useAddable(Addable a){
        int sum = a.add(10, 20);
        System.out.println(sum);
    }
}

Lambda表达式的省略模式

省略规则:

  • 参数类型可以省略,但是有多个参数的情况下,不能只省略一个
  • 如果参数有且仅有一个,那么小括号可以省略
  • 如果代码块的语句只有一条,可以省略大括号和分号,甚至是return。
package Demo17;
public class AddableDemo {
    public static void main(String[] args) {
//在主方法中调用useAddable方法
//        useAddable( (int x ,int y ) ->{
//            return  x y;//简化重写方法可以看做
        //参数的类型可以省略
//        useAddable( (x,y) -> {
//            return x y;
//        });
//        //类型虽然可以省略,但是有多个参数的情况下不能只省略一个
//         useFlyable( (String s ) -> {
//             System.out.println(s);
//         });//如果参数有且仅有一个,小括号可以省略
//        useFlyable( s -> {
//            System.out.println(s);
//        });
        //如果代码块的语句只有一条,可以省略大括号和分号
        useFlyable(  s  -> System.out.println(s));
        //useAddable( (x,y) -> return x y);//如果有return,return也要省略,只针对代码块只有一条的情况
        useAddable( (x,y) -> x y);
    }
    private  static void useAddable(Addable a){
        int sum = a.add(10, 20);
        System.out.println(sum);
    }
    private  static void useFlyable(Flyable f){
        f.fly("风和日丽,晴空万里");
    }
}

Lambda使用注意事项

  • 使用Lambda必须要有接口,并且接口中有且仅有一个抽此昂方法
  • 必须有上下文环境,才能推导出lambda对应接口

根据局部变量的赋值得知lambda对应的接口:Runnable r = () -> System.out.println("lambda表达式");

根据调用方法的参数得知lambda对应的接口:new Thread( () -> System.out.println("lambda表达式")).start();

package Demo18;
public class LambdaDemo {
    public static void main(String[] args) {
//        useInter( () -> {
//            System.out.println("好好学习,天天向上");
//        });
        //使用Lambda必须要有接口,并且接口有且仅有一个抽象方法
        useInter( () -> System.out.println("好好学习,天天向上"));
        //必须要有上下文华宁,才能推导出lambda对应接口
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("匿名内部类");
//            }
//        });
        Runnable r = () -> System.out.println("lambda表达式");
        new Thread(r).start();
        new Thread( () -> System.out.println("lambda表达式")).start();
    }
  private  static void useInter(Inter i ){
        i.show();
  }
}

Lambda表达式和匿名内部类的区别

所需类型不同:

  • 匿名内部类:可以是接口,也可以是抽象类,还有可以是具体类
  • lambda表达式:只能是接口

使用限制不同:

  • 如果接口中有且仅有一个抽象方法,可以使用lambda表达式,也可以使用匿名内部类
  • 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用lambda比表达式

实现原理不同:

  • 匿名内部类:编译之后,产生一个单独的.class字节码文件
  • lambda表达式:编译之后,没有一个单独的.class文件,对应哪个的字节码会在运行的时候动态生成
package Demo19;
public class LambdaDemo {
    public static void main(String[] args) {
////匿名内部类,接口可以使用多个抽象方法
//        useInter(new Inter() {
//            @Override
//            public void show1() {
//                System.out.println("接口");
//            }
//            public void show2() {
//                System.out.println("接口");
//            }
//        });
//    useAnimal(new Animal() {
//        @Override
//        public void method() {
//            System.out.println("抽象类");
//        }
//    });
//    useStudent(new Student(){
//        @Override
//        public void study(){
//            System.out.println("具体类");
//        }
//    });
        //lambda,接口有且仅有一个抽象方法
        // useInter( () -> System.out.println("接口"));
        //useAnimal(() -> System.out.println("接口"));
      //  useStudent(() -> System.out.println("具体类"));
        //使用lambda的地方参数必须是一个接口(有且只有一个)

    }
    private static void useStudent(Student s ){s.study();}
    private static void useAnimal(Animal a ){a.method();}
    private  static void useInter(Inter i ){i.show1();i.show2();}
}

到此这篇关于Lambda表达式的使用及注意事项的文章就介绍到这了,更多相关Lambda表达式 内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Lambda表达式的使用及注意事项的更多相关文章

  1. ios – 如何使用Magical Record创建和更新对象并保存它们而不使用contextForCurrentThread

    解决方法所以,我使用客观C而不是RubyMotion,但你应该能够这样做:编辑如果要稍后保存上下文,您只需要坚持下去:这里的主要思想是,您只需要掌握上下文并在准备就绪时执行您的操作.如果要进行后台保存,请使用以下方法:

  2. OC的Block、Swift的Closure及C#的Lambda对比

    Block:代码块、语法糖、对象Closure:闭包、自包含模块、捕获前后变量处理逻辑Lambda:可用于创建委托或表达式目录树类型的匿名函数Lambda运算符=>的左边列出了需要的参数,右边定义了赋予Lambda变量方法的实现代码。

  3. Android Studio重构还原所有lambda和其他Java 8功能

    AndroidStudioIDE中是否内置了此类功能?解决方法您可以通过将光标置于–>内来替换lambda.然后按AltEnter然后选择“用……替换lambda”您可以通过展开菜单并选择“修复所有…”来对整个文件执行此操作.您可以按照上述步骤在整个项目中执行此操作,而是单击“运行检查…”选择“整个项目”检查完成后,右键单击“Lambda可以替换…”部分并选择“将lambda替换为……”

  4. android – lambda表达式未使用

    lambda表达式如何未使用?

  5. android – kotlin lambda表达式作为可选参数

    如何将lambda表达式作为Kotlin语言中的可选参数传递我必须传递上面的东西就像可选参数解决方法下面定义了一个接受函数的函数,如果没有提供函数,则指定传递函数的默认值.您可以传递自己的功能:您可以省略该功能并使用默认值:或者,您可以将标准库maxOf函数作为默认值,而不是编写自己的函数:

  6. 如何在PHP环境中使用ProtoBuf数据格式

    这篇文章主要介绍了如何在PHP环境中使用ProtoBuf数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  7. 使用sockets:从新闻组中获取文章(三)

    >我们从服务器的这个新闻组中读取了最后的十篇文章,。也可以通过使用HEAD命令读取文章的头信息,或者使用BODY命令读取文章内容。>关于fclose()的更多信息,请参考http://www.php.net/manual/function.fclose.php结论在上文中,我们看到了怎样打开、使用然后关闭一个socket:连接到一个NNTP服务器,取回一些文章。使用POST命令发表文章也复杂不到哪儿去。下一步就是编写一个基于WEB的新闻组客户端了。这样,你有了一个基于web的搜索新闻组的程序了。

  8. JavaScript中Webpack的使用教程

    Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源,这篇文章主要介绍了JavaScript中Webpack的使用,需要的朋友可以参考下

  9. vue3中$attrs的变化与inheritAttrs的使用详解

    $attrs现在包括class和style属性。 也就是说在vue3中$listeners不存在了,vue2中$listeners是单独存在的,在vue3 $attrs包括class和style属性, vue2中 $attrs 不包含class和style属性,这篇文章主要介绍了vue3中$attrs的变化与inheritAttrs的使用 ,需要的朋友可以参考下

  10. PHP中GET变量的使用

    自PHP4.1.0以后将HTTP_GET_VARS使用GET变量来保存,GET的变量主要来自以下的方法对服务器以获取资料信息为请求方法的例如,URL,使用FORM的METHOD为GET方式。这样所有的请求变量将通过URL传递给服务器,服务器根据配置调用相关的解释器来处理这些GET出来的变量。arg_separator.input=";,"————二、自己编写解释语法list=$_GET;//将GET变量分解出来$tmp=explode;//将数据分出这个用法的优点在于,别人无法知道您传递的值是被谁使用,您

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部