简介

匿名类相信大家都用过了,学过JDK8中的lambda表达式之后,可以发现有些匿名类是可以用lambda表达式来替代的,能够被替代的类叫做funcational interface。

具体的有关lambda表达式和匿名类的介绍,大家可以查阅我之前写的文章。这里就不多讲了。

本文主要介绍var和匿名类之间的一些平时没有注意到的问题。

更多内容请访问www.flydean.com

匿名类中自定义变量

我们看一个经常使用的Runnable匿名类:

Runnable runnable = new Runnable() {
String className=Thread.currentThread().getName();
@Override
public void run() {
log.info("inside runnable");
}
};

和平常使用的Runable不一样的是,我们为匿名类添加了一个变量叫做className。

因为Runnable接口并没有定义如何去访问这个新创建的className字段,所以使用runnable.className是会编译错误的。

但是如果我们将Runnable替换成为var:

var runnable = new Runnable() {
String className=Thread.currentThread().getName();
@Override
public void run() {
log.info("inside runnable");
}
};
log.info(runnable.className);

可以看到神奇的事情发生了,var变量可以访问到className。

lambda表达式中的匿名类

我们经常在Stream的遍历和处理中使用lambda表达式,但是可能很少有人在lambda表达式中使用匿名类。

没关系,下面我们再举个例子:

List<Object> objects=Stream.of(1,2,3,4).map(i-> new Object(){
int count=i;
}).filter(o -> o.count >0)
.collect(Collectors.toList());
log.info("{}",objects);

上面的例子中,我们创建了一个stream,在map的过程中返回了新创建的匿名Object,在匿名Object内部我们定义了一个叫做count的变量。

注意在接下来的filter中,我们实际上是可以直接使用map中创建的Object,并且可以直接访问其新定义的count变量。

总结

本文讲解了var变量中一些不为人知的小技巧,同时介绍了在lambda表达式中的匿名类的使用,希望大家能够喜欢。

本文的例子[https://github.com/ddean2009/

learn-java-base-9-to-20](https://github.com/

ddean2009/learn-java-base-9-to-20)

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/jdk10-var-anonymous-class/

本文来源:flydean的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!

JDK10的新特性:var和匿名类的更多相关文章

  1. .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)

    1.自动属性 Auto-Implemented Properties 2.隐式类型 var  var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...

  2. Java8新特性探索之Optional类

    为什么引入Optional类? 身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前 ...

  3. JDK10 新特性

    关于至此,我从大一下学习,以及大二上的巩固,这应该是SE部分的最后一章节内容,介绍一下jdk10的新特性 jdk在更新10之后,出现很多新特性,根据我所观看的视频,主要提及以下几点新特性 1.新增va ...

  4. C#6.0新特性:var s = $"{12}+{23}={12+23}"

    为什么会出现$符号,c#6.0才出现的新特性 var s = string.Fromat("{0}+{1}={2}",12,23,12+23) 用起来必须输入string.From ...

  5. C#6新特性,让你的代码更干净

    前言 前几天看一个朋友的博客时,看他用到了C#6的特性,而6出来这么长时间还没有正儿八经看过它,今儿专门看了下新特性,说白了也不过是语法糖而已.但是用起来确实能让你的代码更加干净些.Let's try ...

  6. ECMAScript 6新特性(1)数组篇

    数组现有的方法: .concat():连接两个或更多的数组,并返回结果. .join():把数组的所有元素放入一个字符串.元素通过指定的分隔符进行分隔. .pop():删除并返回数组的最后一个元素 . ...

  7. C# 3.0 / C# 3.5 对象集合初始化器、匿名类

    对象集合初始化器 在 .NET 2.0 中构造一个对象的方法一是提供一个重载的构造函数,二是用默认的构造函数生成一个对象,然后对其属性进行赋值. 在 .NET 3.5/C# 3.0 中,我们有一种更好 ...

  8. 总结:JDK1.5-JDK1.8各个新特性

    JDK1.5-JDK1.8各个新特性 JDK各个版本的新特性 要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言.以下介绍一下JDK1 ...

  9. 一文带你看遍 JDK9~14 的重要新特性!

    Java9 发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化其中最重要的改动是 Java 平台模块系统的引入,其他还有诸如 ...

  10. JavaEE基础(二十七)/反射、JDK新特性

    1.反射(类的加载概述和加载时机) A:类的加载概述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载  就是指将class文件读入 ...

随机推荐

  1. mysql分组后获取每个组排序后的第一条数据(整行)

    有一个学生分数表student,数据结构是这样的 CREATE TABLE `student` ( `id` int(11) NOT NULL, `student_id` int(11) DEFAUL ...

  2. RK3568开发笔记(九):开发板buildroot固件调通RS485口,运行项目中RS485协议调试工具Demo

    前言   上一篇已经将Qt移植过去了,此时我们移植整体应用不是什么问题了,那么现在应用对外得接口使用了RS485接口,板载了一个RS485,于是需要调通,兼容这个开发板得RS485.   补充   看 ...

  3. python各版本新特性

    # py3.7 https://docs.python.org/zh-cn/3/whatsnew/3.7.html # py3.8 https://docs.python.org/zh-cn/3/wh ...

  4. javascript浮点数相减、相乘出现一长串小数

    149.7 * 100 = 14969.999999999998 3.57 - 2.33 = 1.2399999999999998 这是JavaScript浮点运算采用IEEE 754标准导致的Bug ...

  5. 【Azure 环境】微软云上主机,服务的安全更新疑问

    [问题一]微软云上的虚拟机,不论是Windows系统or Linux 系统,系统的安全补丁是由微软云平台   打上补丁进行修复,还是使用虚拟机的用户手动更新修复呢? [答]这些补丁不会由平台来直接操作 ...

  6. 一次生产环境OOM排查

    一.背景 前几天下午飞书告警群里报起了java.lang.OutOfMemoryError: unable to create new native thread告警,看见后艾特了对应的项目负责人但是 ...

  7. 图数据库 NebulaGraph 的 Java 数据解析实践与指导

    如何快速.即时.符合直觉地去处理 Nebula Java Client 中的数据解析?读这一篇就够了. 图数据库 NebulaGrpah 的论坛和微信群里,有不少用户问及了 Java 客户端数据解析的 ...

  8. Docker的使用记录

    开始 这是第一个尝试在Leanote上面编写文章,我觉得最重要的事情就是能够保证md文件是能够移植的,否则如果这个软件不靠谱的话,我还能把文章移动到别的地方去.所以先写一篇文章看看效果如何,方便不方便 ...

  9. ventoy集成微PE+优启通;vmware虚拟机如何进入PE系统,ventoy启动盘制作。

    Ventoy下载地址:Ventoyhttps://www.ventoy.net/cn/index.html 一.Ventoy介绍 Ventoy是一个制作可启动U盘的开源工具.有了Ventoy你就无需反 ...

  10. Thinkphp6 自定义命令创建类文件

    以创建控制器为例 1.先通过 think 命令创建一个make文件,效果如下图: php think make:command make/MyController 2.修改上面创建的文件[MyCont ...