Java的λ表达式(1)

λ表达式的基本用途

回调与Java8的λ表达式 说明了Java8的λ表达式的基本用途:完成了回调的原意——代码的参数化。

回调:可以简单地说,如果你的方法需要override底层或JDK的某个类的方法,而且你从来没有自己调用过该方法,则该方法(有时候,也指被改写的方法)就是回调。例如

  • Applet定义的init()、start()、stop()和destroy();
  • 图形绘制方法paint(Graphics)、update(Graphics)和重载的repaint();
  • java.lang.Runnable的run();
  • GUI中ActionListener的actionPerformed(ActionEvent e)...

在Java8之前,回调的代码通常由匿名类提供,如下代码(完整代码见回调与Java8的λ表达式 )

        s.register(new IClient(){
             @Override public void callback(int i){
                 System.out.println("==" + i + "0%");
             }
        });

现在则可以:

        IClient listener1=(i)->{System.out.println("+" + i + "0%");};
        s.register(listener1);
        s.register((i)->{System.out.println("++" + i + "0%");});

显然,使用λ表达式提供回调代码较匿名类简洁,较Client implements IClient简洁得更多。

λ表达式有三部分组成:(参数列表),箭头->,{一个代码块}

因为IClient是仅有一个抽象方法的接口,既然唯一的抽象方法是

public void callback(int i);

那么,而编译器将赋值给IClient类型变量如listener1的“某λ表达式”,识别为
给那个唯一的抽象方法提供方法体的匿名实现类。从代码输入的角度,λ表达式就可以尽可能的简单。

  • IClient listener1= (int i)->{System.out.println("+" + i + "0%");};

    //IClient的唯一的抽象方法的方法名不需要了,肯定为callback提供方法体。也不能要,λ表达式的三部分,容不下方法名。

  • listener1=(i)->{/**/};  

    //可以省略i的类型,编译器从唯一的抽象方法的形参列表中可以推导类型

  • listener1=
    i->{};

    //只有单一的形参的时候,可以省略λ表达式的形参括号

其他情况,你可以按照敲代码最少的原则,自己试一试。例如

  1. 如果唯一的抽象方法是int
    getX()。其λ表达式为 ()->{return 0;} ()->0;

    //yqj2065还想省略形参括号,如同“->0”,

  2. 如果唯一的抽象方法是int
    add(int i,int j)。其λ表达式为(i,j)->{return
    i+j;} 或 (i,j)->i+j;

函数接口

为什么能够写出

  • IClient listener1=某λ表达式;
  • s.register(某λ表达式);

因为IClient是仅有一个抽象方法的接口——函数(型)接口(functional
interface)

  1. IClient listener1=某λ表达式;

    编译器解读为 某λ表达式 为IClient的仅有抽象方法提供代码。虽然IClient“是一个”Object,可以

    Object obj= listener1;

    但是,

    Object obj= 某λ表达式;

    感觉上就不太靠谱,“某λ表达式”是为谁的仅有抽象方法提供代码呢?so,

    Object obj= (IClient)某λ表达式;//ok

  2. s.register(某λ表达式);

    因为按照register(IClient listener),编译器知道 某λ表达式 为IClient的仅有抽象方法提供代码。

函数接口只能够有一个抽象方法。假设IClient继承Runnable,又想作为函数接口@FunctionalInterface,就得给继承过来的run()提供方法体(这里给一个空方法体凑数)。

package Lower;
/**
 * @author yqj2065
 */
@FunctionalInterface
public interface IClient extends Runnable{
    int add(int i,int j);
     @Override  default public  void run(){};
}

函数接口(一般地,普通接口)中使用
default关键字,可以添加具有实现的方法,这个玩意就是Java接口的默认方法

在函数接口中出现默认方法,好像有点理由;一般接口中使用默认方法,参考纠结的默认方法

Java的λ表达式(1),布布扣,bubuko.com

时间: 2024-08-09 06:34:33

Java的λ表达式(1)的相关文章

Java Lambda表达式入门[转]

原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示例程序 Examples.zip .原文日期: 2014年4月16日 翻译日期: 2014年4月27日翻译人员: 铁锚简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要

Java Web表达式注入

原文:http://netsecurity.51cto.com/art/201407/444548.htm 0×00 引言 在2014年6月18日@终极修炼师曾发布这样一条微博: 链接的内容是一个名为Jenkins的服务,可以在没有password的情况下受到攻击.而攻击方法比较有趣,Jenkins提供了一个Script Console功能,可以执行Groovy 脚本语言.下面我们来看下维基百科对于这个脚本语言的解释:  Groovy是Java平台上设计的面向对象编程语言.这门动态语言拥有类似P

Java Lambda表达式入门

原文链接: Start Using Java Lambda Expressions 下载示例程序 Examples.zip . 原文日期: 2014年4月26日 翻译日期: 2014年4月27日 翻译人员: 铁锚 简介 (译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因为这就和某些很高级的黑客写的代码一样,简洁,难懂,难以调试,维护人员想骂娘.) Lambda表

Java之四 表达式和流程控制

q    运算符和表达式的概念 q    运算符总结 q    运算符和表达式的示例 q    布尔运算 运算符和表达式的概念 运算符表示对操作数所进行的运算. 按操作数的数目来分,可分为如下3类: 一元运算符 (如 ++,--) 二元运算符 (如 +,-,*,/) 三元运算符 (如 ?:) 按照运算符功能来分,基本的运算符主要分为下面几类: 算术运算符 (+,-,*,/,%,++,--) 关系运算符 (>,<,>=,<=,==,!=) 布尔逻辑运算符 (!,&&,

Java四则运算表达式求解

压栈思想计算Java运算表达式 栈的规则是先进后出.利用压栈的思想来计算四则运算表达式是这样的:我们给定两个栈,一个用来存放数字.一个用来存放对应的操作符.假定我们有一个给定的四则运算表达式a+b+c/d*(e+f)-d*a,那我们先把这个表达式拆分成一个个的数字或者是运算符.或者就是括号了.然后我们从左至右遍历每一个元素,遍历过程中遵循步骤和原则如下: (1)遇到数字则直接压到数字栈顶. (2)遇到运算符(+-*/)时,若操作符栈为空,则直接放到操作符栈顶,否则,见(3). (3)若操作符栈顶

Java Lambda表达式forEach无法跳出循环的解决思路

Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导致的,看下面的例子: public static void main(String[] args) { List<String> list = Lists.newArrayList(); list.add("a"); list.add("b"); list.

Java Web-EL表达式 in JSP

Java Web-EL表达式 in JSP 概念 EL(Expression Language)是一种表达式语言,可以替换和简化JSP页面上JAVA代码的书写 语法 ${<在这里写表达式>} 一般只用来写表达式,不写太过于复杂的东西,业务相关的由JavaBean负责 表达式的结果会作为HTML的资源进行直接展示 作用 运算 支持的运算符: 算术运算符:+-*/(也可以用div表示)%(也可以用mod表示) 比较运算符> < >= <= == != 逻辑运算符:&

Java 条件表达式结果的隐式转换

public class IN0102 { public static void main(String[] args) { int a = 'a'; System.out.println(a);//97 float f = (float) 3.2; float sum =1.5f; int num=2; System.out.println((sum<2?1:num/sum));//1.0 System.out.println("-----------------------------

使用Java lambda表达式实现Flink WordCount

本篇我们将使用Java语言来实现Flink的单词统计. 代码开发 环境准备 导入Flink 1.9 pom依赖 <dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId> <version>1.9.0</version> </dependency> <de