一、匿名内部类

一个匿名内部类是一个没有名字的内部类。它将进一步定义一个内部类以及创建一个内部类的实例。

内部类处理器可以使用匿名内部类进行代码简化。

匿名内部类的语法如下所示:

new SuperClassName/InterfaceName() {
// Implement or override methods in superclass or interface
// Other methods if necessary
}

Since an anonymous inner class is a special kind of inner class, it is treated like an inner class

由于匿名内部类必须总是从一个父类继承或者实现一个接口,但是它不能有显式的extends或者implements子句。
一个匿名内部类必须实现父类或者接口中的所有抽象方法
一个匿名内部类总是使用它父类的无参构造方法来创建一个实例,如果一个匿名内部类实现一个接口,构造方法是Object()
一个匿名内部类被编译成一个名为OuterClassName$n.class的类。如果外部类 Test 有两个匿名的内部类,它们将会被编译成Test$1.class 和Test$2.class.

二、lambda表达式

主要参考自:https://www.cnblogs.com/nnxud/p/9827704.html

1、简介

lambda表达式可以用于极大简化事件处理的代码编写。

lambda表达式是Java8的新特征,可以被看作使用精简语法的匿名内部类。

观察上面的lambda表达式发现引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符。

它将Lambda分为以下两个部分
    左侧 : 指定Lambda表达式需要的参数列表
    右侧 : 制定了Lambda体,是抽象方法的实现逻辑,也既Lambda表达式要执行的功能

2、特征

可选类型声明 : 不需要声明参数类型,编译器可以统一识别参数值
    可选的参数圆括号 : 一个参数无需定义圆括号,但多个参数需要定义圆括号
    可选的大括号 : 如果主体包含了一个语句,就不需要使用大括号
    可选的返回关键字 : 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值

3、语法

先给出没有使用lambda表达式之前,使用匿名内部类的写法

//匿名内部类的写法
@Test
public void test() {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello Lambda!");
}
};
runnable.run();
}

语法格式一 : 无参,无返回值

/**
* 语法格式一:无参数,无返回值
* () -> System.out.println("Hello Lambda!");
*/
@Test
public void test1() {
//“->”左边只有一个小括号,表示无参数,右边是Lambda体(就相当于实现了匿名内部类里面的方法了,(即就是一个可用的接口实现类了。))
Runnable runnable = ()->System.out.println("Hello Lambda!");
runnable.run();
}

语法格式二 : Lambda需要一个参数,但是没有返回值

 public static void test2() {
Consumer<String> consumer = (String str) -> System.out.println(str);
consumer.accept("Hello Lambda!");
}

语法格式三 : 数据类型可以省略,因为可由编译器推断得出,称为"类型推断"

    public static void test3() {
Consumer<String> consumer = (str) -> System.out.println(str);
consumer.accept("Hello Lambda!");
}

语法格式四 : Lambda若需要一个参数时,参数的小括号可以省略

 public static void test4() {
Consumer<String> consumer = str -> { System.out.println(str) ;};
consumer.accept("Hello Lambda!");
}

语法格式五 : Lambda需要两个或以上的参数,多条执行语句,并且可以有返回值

    public static void test5() {
Comparator<Integer> com = (x, y) -> {
System.out.println("this is comparator");
return Integer.compare(x, y);
};
int compare = com.compare(100, 244);
System.out.println(compare);
}

语法格式六 : 当Lambda体只有一条语句时,return与大括号若有,都可以省略

   public static void test6() {
Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
int compare = com.compare(100, 244);
System.out.println(compare);
}

Java 匿名类和lambda表达式的更多相关文章

  1. JAVA8 in Action:行为参数化,匿名类及lambda表达式的初步认知实例整理

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...

  2. java语言中的匿名类与lambda表达式介绍与总结 (Anonymous Classes and Lambda Expressions)

    2017/6/30 转载写明出处:http://www.cnblogs.com/daren-lin/p/anonymous-classes-and-lambda-expressions-in-java ...

  3. Java 8 新特性 - Lambda表达式

    Lambda表达式 vs 匿名类既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析.一个关键的不同点就是关键字 this.匿名类的 this 关键字指向匿名类 ...

  4. .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解

    本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...

  5. 匿名方法,Lambda表达式,高阶函数

    原文:匿名方法,Lambda表达式,高阶函数 匿名方法 c#2.0引入匿名方法,不必创建单独的方法,因此减少了所需的编码系统开销. 常用于将委托和匿名方法关联,例如1. 使用委托和方法关联: this ...

  6. Java函数式编程和lambda表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

  7. Java核心技术-接口、lambda表达式与内部类

    本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...

  8. Java基础教程:Lambda表达式

    Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...

  9. java函数式编程之lambda表达式

    作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...

随机推荐

  1. PL真有意思(六):子程序和控制抽象

    前言 在之前我们把抽象定义为一种过程,程序员可以通过它将一个名字与一段可能很复杂的程序片段关联起来.抽象最大的意义就在于,我们可以从功能和用途的角度来考虑它,而不是实现. 在大多数程序设计语言中,子程 ...

  2. Rust更换Crates源

    Rust编译时遇到如下问题: Downloading futures v0.1.19 warning: spurious network error (2 tries remaining): [28] ...

  3. Reactor和Proactor模型

    背景 前面介绍了I/O多路复用模型,那有了I/O复用,有了epoll已经可以使服务器并发几十万连接的同时,还能维持比较高的TPS,难道还不够吗?比如现在在使用epoll的时候一般都是起个任务,不断的去 ...

  4. 基于 HTML5 + WebGL 的宇宙(太阳系) 3D 可视化系统

    前言 近年来随着引力波的发现.黑洞照片的拍摄.火星上存在水的证据发现等科学上的突破,以及文学影视作品中诸如<三体>.<流浪地球>.<星际穿越>等的传播普及,宇宙空间 ...

  5. Kotlin实战案例:带你实现RecyclerView分页查询功能(仿照主流电商APP,可切换列表和网格效果)

    随着Kotlin的推广,一些国内公司的安卓项目开发,已经从Java完全切成Kotlin了.虽然Kotlin在各类编程语言中的排名比较靠后(据TIOBE发布了 19 年 8 月份的编程语言排行榜,Kot ...

  6. 【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你

    一.前言简述 因为最近微信读书出了网页版,加上自己也在闲暇的时候看了两本书,不禁好奇什么样的书更受欢迎,哪位作者又更受读者喜欢呢?话不多说,爬一下就能有个了解了. 二.页面分析 首先打开微信读书:ht ...

  7. 07-kubernetes Ingress 原理 和 Ingress-nginx 案例

    目录 Service 类型 namespace 名称空间 Ingress Controller Ingress Ingress-nginx 进行测试 创建对应的后端Pod和Service 创建 Ing ...

  8. MySQL事务和隔离级别

    Mysql事务 避免事务,会占用内存 事务是啥? 简而言之:事务 - 就是保护多条执行的sql语句,要么全部成功,要么全部失败 比如:转账就是一个事务:从一个用户将资金转出,再将资金转入到另一个用户, ...

  9. python基本文件操作

    python文件操作 python的文件操作相对于java复杂的IO流简单了好多,只要关心文件的读和写就行了 基本的文件操作 要注意的是,当不存在某路径的文件时,w,a模式会自动新建此文件夹,当读模式 ...

  10. Spring Cloud(二):Eureka 服务注册中心

    前言 服务治理 随着业务的发展,微服务应用也随之增加,这些服务的管理和治理会越来越难,并且集群规模.服务位置.服务命名都会发生变化,手动维护的方式极易发生错误或是命名冲突等问题.而服务治理正是为了解决 ...