考虑以下课程:

import java.util.Objects;

import java.util.function.Predicate;

public class LambdaVsMethodRef {

public static void main(String[] args) {

Predicate a = Objects::nonNull;

Predicate b = x -> x != null;

}

}

第一个谓词是从方法引用创建的,另一个是lambda表达式.这些谓词具有相同的行为(nonNull的主体只是返回obj!= null;). lambda短两个字符(可能允许流管道适合一行).

除了代码风格,Objects :: nonNull和x – >之间有什么区别吗? x!= null?换句话说,我应该更喜欢一个吗?

lambda-dev和lambda-libs-spec- {观察者,专家}邮件列表消息提到isNull,nonNull和isNotNull(早期名称)没有解决这一点. (我很惊讶没有人质疑添加Objects方法,因为它们可以用lambda轻松替换,但另一方面,Integer :: sum也是如此.)

我还用javap查看了字节码.唯一的区别是传递给lambda metafactory bootstrap method的方法句柄:

BootstrapMethods:

0: #16 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

Method arguments:

#17 (Ljava/lang/Object;)Z

#18 invokestatic java/util/Objects.nonNull:(Ljava/lang/Object;)Z

#17 (Ljava/lang/Object;)Z

1: #16 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

Method arguments:

#17 (Ljava/lang/Object;)Z

#20 invokestatic LambdaVsMethodRef.lambda$main$1:(Ljava/lang/Object;)Z

#17 (Ljava/lang/Object;)Z

当然,对于方法引用和lambdas来说,元数据可以在JVM的奇思妙想中做不同的事情,所以这并不是很有效.

java nonnull_java – Objects :: nonNull和x – x!= null之间有什么区别吗?相关推荐

  1. java client是什么_“java-server”和“java-client”之间的真正区别?

    慕村9548890 在早期版本的Java中,最明显的直接区别是分配给-client相对于-server申请.例如,在我的Linux系统上,我得到:$ java -XX:+PrintFlagsFinal ...

  2. java obervable_RxJava中Observable,Completable和Single之间有什么区别

    Observable 是通用ReactiveX构建块,它是随时间发送值的事件源 . (因此存在ReactiveX扩展到的每种语言) 简而言之,Observable事件是: onNext *(onCom ...

  3. 教妹学Java(六):JDK,JRE和JVM之间有什么区别?

    大家好,我是沉默王二.本篇文章通过我和三妹的对话来谈一谈"JDK,JRE 和 JVM 之间的区别".本文付费,为表谢意,附送上个人微信(qing_gee),坑位所剩无几,快加,你有 ...

  4. java servlet 3_java – Servlet 2.5和3之间有什么区别?

    更新 正如一个更新和更明确,这些是servlet 2.5和3之间的主要区别(我不想穷举,我只是提到最有趣的部分): 声明servlet,过滤器和监听器的注释(易于开发) 在servlets 2.5中, ...

  5. 【Java】java.util.Objects 工具类方法研究

    [Java]java.util.Objects 工具类方法研究 Objects 与 Object 区别 Object 是 Java 中所有类的基类,位于java.lang包. Objects 是 Ob ...

  6. Java中Objects类的方法介绍(已更新)

    使用软件:eclipse 2019-2 jdk:11 首先,Objects类是属于Java的工具类,具体包的位置是java.Util.Objects.它是在jdk1.7版本中添加的一些用来检查的工具, ...

  7. java.util.Objects 简介

    java.util.Objects 类 包含了几个静态方法,可以实现对对象的比较.生成hash code之类的功能, 很多方法里考虑了对象是null的情况,在输入的参数是null时有特定的处理方式. ...

  8. 报错提示:java.lang.IllegalArgumentException: Target must not be null

    报错提示: org.springframework.web.util.NestedServletException: Request processing failed; nested excepti ...

  9. Java报异常时getMessage()方法返回null

    Java报异常时getMessage()方法返回null 参考文章: (1)Java报异常时getMessage()方法返回null (2)https://www.cnblogs.com/runnin ...

最新文章

  1. 在Xcode中使用Git进行源码版本控制
  2. Vue-Cli3.0怎么使用预渲染怎么配置prerender-spa-plugin
  3. 【学习笔记】项目Leader如何成长
  4. 触发器及其应用实验报告总结_调机技巧总结: 先快后慢射胶法及其应用
  5. vue项目前端服务器,【前端技术】vue自动部署项目到服务器
  6. 安装完SqlServer2008,wamp服务器无法启动的问题
  7. 栈的链式存储结构及实现
  8. Recoll:Unix和Linux桌面的文本搜索工具
  9. python异常处理与上下文管理器
  10. poj 3304 Segments
  11. linux每个任务运行时间,Linux基础教程:任务计划和周期性任务
  12. Arduion 底层原理之 Uart函数 串口收发 串口协议解析
  13. 类似铸剑物语的java游戏_怀旧向:GBA上的10款经典RPG游戏推荐,这些你都玩过吗?...
  14. [异能程序员]第三章 异能初现(第三更)
  15. linux音频函数接口,Linux音频驱动-OSS和ALSA声音系统简介及其比较
  16. FPGA Vivado AXI _DMA IP介绍
  17. 第十六篇 晶体管之电流放大器
  18. Java实现找零问题
  19. 神州云服务平台(型号:DCC-CRL1000)基本配置教学视频
  20. [EGNN] Exploiting Edge Features for Graph Neural Networks 利用图神经网络的边特征 论文详解 CVPR 2019

热门文章

  1. mybatis-plus分页插件(PaginationInnerInterceptor)报错的问题
  2. 店商+电商 BC一体化赋能传统品牌商数字化转型升级
  3. C语言(按位与)、|(按位或)、^(按位异或)运算操作符讲解
  4. 再介绍一款 windows7 瘦身软件介绍: windows 冗余文件清理工具
  5. 蛛网时代:我们不一样!BI工具中的创新者
  6. 新版福昕阅读器自定义注释功能快捷键
  7. 基金跌了怎么办?来听听大咖教你怎么做!
  8. .NET 5.0正式发布,功能特性介绍(翻译)(转载)
  9. linux通过nfs挂载根文件系统报错:VFS: Unable to mount root fs via NFS, trying floppy
  10. vue 组件不受全局样式影响_Vue 组件之间样式冲突