Lambda表达式的使用及注意事项

目录
  • Lambda表达式的使用
  • Lambda表达式的省略模式
  • Lambda使用注意事项
  • Lambda表达式和匿名内部类的区别

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表达式 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Java8如何使用Lambda表达式进行比较

    目录 支持Lambda的基本排序 无类型定义的基本排序 使用引用静态方法进行排序 Sort Extracted Comparators 反向排序 使用多个条件进行排序 使用多个条件排序-组合 使用Stream.sorted()对列表进行排序 使用Stream.sorted()对列表进行反向排序 Null值 结论 在Java 8之前,对集合进行排序需要为排序中使用的比较器 Comparator 创建一个匿名内部类: new Comparator<Human>() { @Override publ

  • java Lambda表达式的使用心得

    目录 Lambda表达式的心得 Lambda表达式法 传统方法 使用Lambda表达式 你首先要知道的 Lambda表达式的技巧 Lambda表达式只能用来简化仅包含一个public方法的接口的创建 双冒号表达形式 Lambda表达式的心得 如题,因为博主也是最近才接触到Lambda表达式的(PS 在这里汗颜一会).我并不会讲解它的原理,诚然任何一件事物如果理解原理的话,使用它必将更加容易.但博主在学习的时候,大多数时候都是学会怎么用,然后在细究原理.就像你骑自行车之前,难道首先还要研究自行车的

  • Java中使用Lambda表达式和函数编程示例

    目录 1.简单介绍 2.Lambdas和Scopes 3.Lambdas与局部变量 4.Lambda体与局部变量 5.Lambdas和'This'和'Super'关键字 6.Lambdas和Exceptions 7.预定义的功能接口 1.简单介绍 第一个示例演示变量声明上下文中的lambda.它将lambda()->{System.out.println("running"):}分配给可运行接口类型的变量r. 第二个示例类似,但演示了赋值上下文中的lambda(到先前声明的变量r

  • C#使用表达式树(LambdaExpression)动态更新类的属性值(示例代码)

    有看过我之前发表过的C#相关文章分享和阅读过我代码的朋友们可能会在我的代码里面经常看到各种各样的λ表达式动态拼接,C#的λ表达式树是一个好东西,也是别的语言学不来的,熟悉掌握λ表达式就能够实现各种场景的个性化操作,如动态拼接查询条件.排序方式等,也能够实现替代反射的高性能操作,比如我们常用到的IQueryable和IEnumerable,每个扩展方法就全是λ表达式树. 本文给大家分享C#使用表达式树(LambdaExpression)动态更新类的属性值的相关知识,在某些业务中会遇到需要同步两个类

  • Java中Lambda表达式的使用详解

    目录 理解函数式接口以及 Lambda表达式的发展过程 Lambda表达式及语法 一起来看看具体的使用 你需要注意什么 Lambda的实际运用 1.对集合排序 2.遍历集合 3.遍历集合(带条件) 4.代替 Runnable,开启一个线程 理解函数式接口以及 Lambda表达式的发展过程 任何接口,只包含唯一一个抽象方法,就是函数式接口 /** * lambdab表达式的发展 */ public class TestLambda1 { //3.静态内部类 static class Like2 i

  • Java中forEach使用lambda表达式,数组和集合的区别说明

    1.数组怎么使用lambda 数组不能直接在forEach中使用lambda表达式 PartnerType[] values = PartnerType.values(); //提示Cannot resolve method 'forEach(<method reference>) values.forEach(System.out::println);//错误使用 想要使用必须转换,如下 (1)转成list (2)转成steam PartnerType[] values = PartnerT

  • LINQ教程之使用Lambda表达式

    C#3.0(.NET3.5)中引入了Lambda表达式和LINQ.Lambda表达式是使用一些特殊语法表示匿名方法的较短方法. 一.最基本的Lambda表达式语法如下: (参数列表)=>{方法体} 说明: 1.参数列表中的参数类型可以是明确类型或者推断类型. 2.如果是推断类型,则参数的数据类型将由编辑器根据上下文自动推断出来. 让我们看看Lambda表达式是如何从匿名方法演变而来的. 相关示例: delegate(int item) { return item % 2 == 0; }; 1.L

  • Java 进阶使用 Lambda 表达式实现超强的排序功能

    目录 基于Comparator排序 使用 Lambda 表达式替换Comparator匿名内部类 通过静态方法抽取公共的 Lambda 表达式 借助Comparator的comparing方法 多条件排序 在Stream中进行排序 倒序排列 调转排序判断 在Comparator.comparing中定义排序反转 在Stream中定义排序反转 null 值的判断 元素是 null 的笨拙实现 排序条件的字段是 null 文末总结 我们在系统开发过程中,对数据排序是很常见的场景.一般来说,我们可以采

  • Lambda表达式的使用及注意事项

    目录 Lambda表达式的使用 Lambda表达式的省略模式 Lambda使用注意事项 Lambda表达式和匿名内部类的区别 Lambda表达式的使用 练习: 定义一个接口flyable,里面定义一个抽象方法 void fly(String s) 定义一个测试类flyabledemo,在测试类中提供两个方法 一个方法是useFlyable(Flyable f) 主方法,在主方法中调用useflyable方法 package Demo16; public interface Flyable { v

  • 关于JavaEE匿名内部类和Lambda表达式的注意事项

    目录 前言 一.匿名内部类 注意事项: 二.Lambda表达式 1.背景 2.函数式接口 3.Lambda表达式的语法 4.Lambda表达式的基本使用 (1)无返回值无参数 (2)无返回值有参数 (3)有返回值无参数 (4)有返回值有参数 总结 前言 上一篇介绍了内部类的前三种类型,链接如下: 关于JavaEE内部类的部分注意事项 接下来将详细介绍匿名内部类以及Lambda表达式的用法和注意事项. 一.匿名内部类 定义在方法中(方法的形参或者实参),没有任何权限修饰符,甚至连类名称都没有的内部

  • python中的lambda表达式用法详解

    本文实例讲述了python中的lambda表达式用法.分享给大家供大家参考,具体如下: 这里来为大家介绍一下lambda函数. lambda 函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函数的地方 .下面的例子比较了传统的函数定义def与lambda定义方式: >>> def f ( x ,y): ... return x * y ... >>> f ( 2,3 ) 6 >>> g = lambda x ,y: x *

  • Android Studio中使用lambda表达式的方法

    1.module的build.gradle里buildTypes中添加: compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } 2.module的build.gradle里defaultConfig中添加: jackOptions.enabled = true 3.注意事项:jack可能会导致中文乱码,所以需要在gradle.proper

  • java8之lambda表达式用法总结

    java8之lambda表达式 目的:行为参数化 Lambda表达式是简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. Lambda的基本语法是(parameters) -> expression 或 (parameters) -> { statements; }.其中, (parameters) -> expression 的表达式中隐含了return,如 () -> 42: (parameters) ->

  • 简单易懂的java8新特性之lambda表达式知识总结

    一.概念 从本质上来说,它就是一个匿名函数,可以用来直接实现接口中的方法,从而简化代码.但是Lambda有一个限制,不能实现接口中的所有方法,所以Lambda表达式只能用于有且仅有一个必须需要实现的方法接口,这里需要注意必须需要实现这六个字. public interface Printer { //有一个需要实现的方法,可以使用Lambda表达式 void print(); } public interface Printer { //有一个需要实现的方法,可以使用Lambda表达式 void

  • Java中Lambda表达式基础及使用

    目录 一.举例说明 1.无参无返回 1.1 定义一个接口 1.2接口实现类 1.3 测试类 2.有参无返回代码示例 3.有参有返回 二.简单事项 1.省略模式 2.注意事项 三.Lambda表达式和匿名内部类的区别 1.所需类型不同: 2.使用限制不同: 3.实现原理不同: 标准格式: 三要素:形式参数 箭头 代码块 格式:(形式参数)->{代码块} 形式参数:如果多个参数用逗号隔开,无参留空 ->:英文中划线和大于号组成 代码块:具体要做的事 使用前提: 有一个接口 接口中有且仅有一个抽象方

  • C# 内部类与Lambda表达式用法详解

    目录 一.内部类 1.什么是内部类? 1.类作为形参和返回值: 2.内部类的几种形式 二.Lambda表达式(强调做什么,而不是以什么形式去做) 1.Lambda表达式的格式要求: 2.Lambda与匿名内部类的区别 1.省略模式 2.Lambda与匿名内部类的区别: 三.方法引用 1.方法的概述: 2.常见的方法引用方式: 3.方法引用的具体方式: 一.内部类 1.什么是内部类? 1.类作为形参和返回值: 抽象类作为形参和返回值: 通过多态的形式去传递抽象类作为形参的方法,方法的形参与返回值为

  • JavaScript具有类似Lambda表达式编程能力的代码(改进版)

    在发了博文之后,我又花了一些时间尝试解决这个问题--经过几次尝试之后,我找到了另一种pattern,括号并不再是必要的了: 复制代码 代码如下: eval(function () { var s = '', ww = [v] > (s += v); var ws = [n] > ww(' <A href="#">(' + n + ')</A> '); pnView3(14, [n] > ww(' [' + n + '] '), 1, 37, w

  • Java8之lambda表达式基本语法

    lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) class Student{ private String name; private Double score; public Student(String name, Double score) { this.name = name; this.score = score; } public String getName() { return name; } public Double getS

随机推荐