Java Lambda表达式入门示例

本文实例讲述了Java Lambda表达式。分享给大家供大家参考,具体如下:

一 点睛

Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(函数式接口)的实例。

Lambda表达式主要作用就是代替匿名内部类的繁琐语法。

它由三部分组成:

  • 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
  • 箭头(->),必须通过英文等号和大于符号组成。
  • 代码块。如果代码块只有包含一条语句,Lambda表达式允许省略代码块的花括号,如果省略了代码块的花括号,这条语句不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。

二 用匿名内部类实现命令模式

1 代码

Command接口

public interface Command
{
  // 接口里定义的process()方法用于封装“处理行为”
  void process(int[] target);
}

ProcessArray类

public class ProcessArray {
  public ProcessArray() {
  }
  public void process(int[] target, Command cmd) {
    cmd.process(target);
  }
}

CommandTest类

public class CommandTest {
  public CommandTest() {
  }
  public static void main(String[] args) {
    ProcessArray pa = new ProcessArray();
    int[] array = new int[]{3, -4, 6, 4};
    pa.process(array, new Command() {
      public void process(int[] target) {
        int sum = 0;
        int[] var3 = target;
        int var4 = target.length;
        for(int var5 = 0; var5 < var4; ++var5) {
          int tmp = var3[var5];
          sum += tmp;
        }
        System.out.println("数组元素的总和是:" + sum);
      }
    });
  }
}

2 运行

数组元素的总和是:9

三 用Lambda表达式实现命令模式

1 代码

public class CommandTest2
{
  public static void main(String[] args)
  {
   ProcessArray pa = new ProcessArray();
   int[] array = {3, -4, 6, 4};
   // 处理数组,具体处理行为取决于匿名内部类
   pa.process(array , (int[] target)->{
      int sum = 0;
      for (int tmp : target )
      {
        sum += tmp;
      }
      System.out.println("数组元素的总和是:" + sum);
     });
  }
}

2 运行

数组元素的总和是:9

四 比较

Lambda表达式与匿名内部类比较,不需要new XXX(){}这种繁琐的代码,不需要指出重写方法名字,不需要给出重写方法的返回值类型,只要给出重写的方法括号以及括号里的形参列表即可。

Lambda表达式的代码块会代替实现方法的方法体,Lambda表达式就相对于一个匿名方法。

五 Lambda表达式的简化写法

1 代码

interface Eatable
{
  void taste();
}
interface Flyable
{
  void fly(String weather);
}
interface Addable
{
  int add(int a , int b);
}
public class LambdaQs
{
  // 调用该方法需要Eatable对象
  public void eat(Eatable e)
  {
   System.out.println(e);
   e.taste();
  }
  // 调用该方法需要Flyable对象
  public void drive(Flyable f)
  {
   System.out.println("我正在驾驶:" + f);
   f.fly("【碧空如洗的晴日】");
  }
  // 调用该方法需要Addable对象
  public void test(Addable add)
  {
   System.out.println("5与3的和为:" + add.add(5, 3));
  }
  public static void main(String[] args)
  {
   LambdaQs lq = new LambdaQs();
   // Lambda表达式的代码块只有一条语句,可以省略花括号。
   lq.eat(()-> System.out.println("苹果的味道不错!"));
   // Lambda表达式的形参列表只有一个形参,省略圆括号
   lq.drive(weather ->
   {
     System.out.println("今天天气是:" + weather);
     System.out.println("直升机飞行平稳");
   });
   // Lambda表达式的代码块只有一条语句,省略花括号
   // 代码块中只有一条语句,即使该表达式需要返回值,也可以省略return关键字。
   lq.test((a , b)->a + b);
  }
}

2 运行

LambdaQs$$Lambda$1/1078694789@3d075dc0
苹果的味道不错!
我正在驾驶:LambdaQs$$Lambda$2/1149319664@7cca494b
今天天气是:【碧空如洗的晴日】
直升机飞行平稳
5与3的和为:8

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java8新特性lambda表达式有什么用(用法实例)

    我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值.现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析Java集合里面的批量数据操作(bulk operation),解开lambda最强作用的神秘面纱. 1.关于JSR335 JSR是Java Specification Requests的缩写,意思是Java 规范请求,Java 8 版本的主要改进是 Lambda 项目(JSR 335),其

  • Java编程中使用lambda表达式的奇技淫巧

    为什么使用Lambda表达式 先看几个例子: 第一个例子,在一个独立的线程中执行某项任务,我们通常这么实现: class Worker implements Runnable { public void run() { for (int i = 0; i < 100; i++) doWork(); } ... } Worker w = new Worker(); new Thread(w).start(); 第二个例子,自定义字符串比较的方法(通过字符串长度),一般这么做: class Leng

  • Java的lambda表达式实现解析

    Java8引入了lambda表达式.lambda表达式并不是新功能,只是为了方便代码编写的语法糖. 但,即便是在其他语言已经司空见惯的lambda表达式,如果在Java中要支持它,还需要考虑各种向下兼容的问题. 简单的说,Java的lambda表达式支持,大约需要考虑2个方面 需要支持lambda语法,以替代原有的方法匿名类 需要考虑已有JDK中,如何增加新操作以支持lambda表达式 对于第一点的回答是FuntionalInterface的Annotation,第二点的回答是default方法

  • Java8中的 Lambda表达式教程

     1. 什么是λ表达式 λ表达式本质上是一个匿名方法.让我们来看下面这个例子: public int add(int x, int y) { return x + y; } 转成λ表达式后是这个样子: (int x, int y) -> x + y; 参数类型也可以省略,Java编译器会根据上下文推断出来: (x, y) -> x + y; //返回两数之和 或者 (x, y) -> { return x + y; } //显式指明返回值 可见λ表达式有三部分组成:参数列表,箭头(-&g

  • Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块). Lambda表达式还增强了集合库. Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及 java.util.stream 包. 流(stream)就如同迭代器(iterator),但附加了许多额外的功能.

  • Java8新特性Lambda表达式的一些复杂用法总结

    简介 lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的"函数式编程". 它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数. 本文将介绍关于Java8 Lambda表达式的一些复杂用法,分享出来供大家参考学习,下面来一起看看详细的介绍: 复杂用法实例 传入数组ids,在list<Obj>上操作,找出Obj中id想匹配的,并且按

  • Java8新特性之Lambda表达式浅析

    说到java 8,首先会想到lambda(闭包)以及虚拟扩展方法(default method),这个特性早已经被各大技术网站炒得沸沸扬扬了,也是我们java 8系列开篇要讲的第一特性(JEP126 http://openjdk.java.net/jeps/126),jdk8的一些库已经应用了lambda表达式重新设计了,理解他对学习java 8新特性有着重要的意义. 一.函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是

  • java中lambda表达式语法说明

    语法说明 一个lambda表达式由如下几个部分组成: 1. 在圆括号中以逗号分隔的形参列表.在CheckPerson.test方法中包含一个参数p,代表了一个Person类的实例.注意:lambda表达式中的参数的类型是可以省略的:此外,如果只有一个参数的话连括号也是可以省略的.比如上一节曾提到的代码: p -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25

  • 深入理解Java中的Lambda表达式

    Java 8 开始出现,带来一个全新特性:使用 Lambda 表达式 (JSR-335) 进行函数式编程.今天我们要讨论的是 Lambda 的其中一部分:虚拟扩展方法,也叫做公共辩护(defender)方法.该特性可以让你在接口定义中提供方法的默认实现.例如你可以为已有的接口(如 List 和 Map)声明一个方法定义,这样其他开发者就无需重新实现这些方法,有点像抽象类,但实际却是接口.当然,Java 8 理论上还是兼容已有的库. 虚拟扩展方法为 Java 带来了多重继承的特性,尽管该团队声称与

  • Java Lambda表达式入门示例

    本文实例讲述了Java Lambda表达式.分享给大家供大家参考,具体如下: 一 点睛 Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(函数式接口)的实例. Lambda表达式主要作用就是代替匿名内部类的繁琐语法. 它由三部分组成: 形参列表.形参列表允许省略形参类型.如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略. 箭头(->),必须通过英文等号和大于符号组成. 代码块.如果代码块只有包含一条语句,Lambda表达式

  • Java Lambda 表达式详解及示例代码

    Java Lambda 表达式是 Java 8 引入的一个新的功能,可以说是模拟函数式编程的一个语法糖,类似于 Javascript 中的闭包,但又有些不同,主要目的是提供一个函数化的语法来简化我们的编码. Lambda 基本语法 Lambda 的基本结构为 (arguments) -> body,有如下几种情况: 参数类型可推导时,不需要指定类型,如 (a) -> System.out.println(a) 当只有一个参数且类型可推导时,不强制写 (), 如 a -> System.o

  • Java Lambda表达式的方法引用和构造器引用实例分析

    本文实例讲述了Java Lambda表达式的方法引用和构造器引用.分享给大家供大家参考,具体如下: 一 点睛 如果Lambda表达式的代码块只有一条代码,还可以在代码块中使用方法引用和构造器引用,以使得Lambda表达式更加简洁. 种类 示例 说明 对应的Lambda表达式 引用类方法 类名::类方法 函数式接口中被实现方法的全部参数传给该类方法作为参数. (a,b,...) -> 类名.类方法(a,b, ...) 引用特定对象的实例方法 特定对象::实例方法 函数式接口中被实现方法的全部参数传

  • Java8中的lambda表达式入门教程

    1.基本介绍 lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,先上代码: 1.1 两种方式的对比 1.1.1 方式1-匿名内部类 class Student{ private String name; private Double score; public Student(String name, Double score) { this.name = name; this.score = score; } public String getName() { ret

  • Java Lambda表达式与匿名内部类的联系和区别实例分析

    本文实例讲述了Java Lambda表达式与匿名内部类的联系和区别.分享给大家供大家参考,具体如下: 一 点睛 Lambda表达式与匿名内部类存在如下相同点: Lambda表达式与匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部类的成员变量(包括实例变量和类变量). Lambda表达式创建的对象与匿名内部类生成的对象一样, 都可以直接调用从接口继承得到的默认方法. Lambda表达式与匿名内部类主要存在如下区别: 匿名内部类可以为任意接口创建实例

  • Java Lambda表达式和函数式接口实例分析

    本文实例讲述了Java Lambda表达式和函数式接口.分享给大家供大家参考,具体如下: 一 点睛 Lambda表达式的类型,也称为"目标类型",Lambda表达式的目标类型必须是函数式接口.函数式接口代表只包含一个抽象方法的接口.函数式接口可以包含多个默认方法.类方法,但只能声明一个抽象方法. 如果采用匿名内部类语法来创建函数式接口的实例,只要实现一个抽象方法即可,在这种情况下即可采用Lambda表达式来创建对象,该表达式创建出来的对象的目标类型就是这个函数式接口. Java 8专门

  • Java lambda表达式实现Flink WordCount过程解析

    这篇文章主要介绍了Java lambda表达式实现Flink WordCount过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本篇我们将使用Java语言来实现Flink的单词统计. 代码开发 环境准备 导入Flink 1.9 pom依赖 <dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>

  • 教你在一分钟之内理解Java Lambda表达式并学会使用

    一.前言 Lambda表达式是java 8中包含的重要功能之一. Lambda表达式用于为由一个方法组成的接口编写简洁的代码,即函数接口(functional interface). Lambda表达式也被用来以简单的方式遍历集合. 对于一个单一方法的接口,无论我们使用匿名类或内部类来实现,同样也可以在java 8中使用Lambda表达式来实现非常简明的代码. Lambda表达式定义了函数接口方法,并返回该接口的实例. 二.Lambda 表达式语法 Lambda 表达式语法非常易于阅读和理解.

  • Java Lambda 表达式源码解析

    Java Lambda 源码分析 问题: Lambda 表达式是什么?JVM 内部究竟是如何实现 Lambda 表达式的?为什么要这样实现? 一.基本概念 1.Lambda 表达式 下面的例子中,() -> System.out.println("1") 就是一个 Lambda 表达式.Java 8 中每一个 Lambda 表达式必须有一个函数式接口与之对应.Lambda 表达式就是函数式接口的一个实现. @Test public void test0() { Runnable

随机推荐