Java8新增了lambda表达式,最常见的用法是配合 Stream

做集合操作。下面是一种类似彩蛋的东西可以妙用到某些场合。

一般用法,比如下面这样

Optional.of(1L).ifPresent(number -> {

System.out.println(number);

});

或者简化成这样

Optional.of(1L).ifPresent(System.out::println);

有什么办法能获取到 System.out::println

里面的方法名字符串 String methodName = "println"

啥效果?

执行

FnConverter fnConverter = new FnConverter<>();

String fieldName = fnConverter.convertFnToString(Foo::getBar);

System.out.println("方法名:"+fieldName);

输出

方法名:bar

怎么做?

第一步:定义一个 FunctionalInterface

(敲黑板,画重点 extends Seriali

)

/**

* @author Frank

*/

@FunctionalInterface

public interface Fn extends Serializable {

Object apply(T source);

}

第二布:准备个类(酱油)

import lombok.Data;

/**

* @author liuyuyu

*/

@Data

public class Foo {

private Integer bar;

}

第三步:获取 Fn

的信息的工具类

import

画重点 SerializedLambda serializedLambda = (SerializedLambda) method.invoke(fn);

第四步:写个梨子跑起来

/**

* @author liuyuyu

*/

public class FnConverter {

public String convertFnToString(Fn fn){

return Reflections.fnToFieldName(fn);

}

public static vo

Run

方法名:bar

啥原理?

Serializable

是Java对象序列化的接口,凡是实现这个接口(interface是继承,也算)Java都要提供序列化和反序列化的方法( ObjectInputStream/ObjectOutputStream

可能会让你想起点什么)。

但是lambda比较特殊,它是一个方法,可以认为是一个动作(或者说是SerializedLambda

这个类保存lambda的信息。

public

知道了这个隐藏(彩)特性(蛋),我们回头看看刚才黑板上画的重点

@FunctionalInterface //lambda

public interface Fn extends Serializable //序列化接口

两个条件满足

因为这个东西是个隐藏(彩)特性(蛋),我们不能直接获取到 SerializedLambda

。直接上反射!

SerializedLambda serializedLambda = (SerializedLambda) method.invoke(fn);

这样,我们就可以获取到lambda的方法名

java sao_Java SAO操作-使用lambda代替字符串相关推荐

  1. Java SAO操作-使用lambda代替字符串

    获取lambda的详细信息 要说啥? Java8新增了lambda表达式,最常见的用法是配合Stream做集合操作.下面是一种类似彩蛋的东西可以妙用到某些场合. 一般用法,比如下面这样 Optiona ...

  2. STL之multiset中equal_range,multimap中的equal_range,bitset容器,string字符串操作,lambda表达式

     1multiset中用equal_range来遍历所有的元素 #include <set> #include <iostream> using namespace std ...

  3. Java Lambda 连接字符串

    Java Lambda 连接字符串 public class Menu {/*** 菜品名称*/private String name;/*** 菜品单价*/private Double price; ...

  4. Java 8th 函数式编程:lambda 表达式

    Lambda 表达式是 java 8th 给我们带来的几个重量级新特性之一,借用 lambda 表达式可以让我们的程序设计更加简洁.最近新的项目摒弃了 6th 版本,全面基于 8th 进行开发,本文将 ...

  5. 【Java 8 in Action】Lambda表达式

    文章目录 Lambda表达式 Lambda表达式的介绍 Lambda表达式的语法 Method References Default methods Functional Interface 浅析La ...

  6. Java 8 新特性之Lambda

    Java 8 新特性之Lambda.Stream.Optional Java 8 新特性之Lambda.Stream.Optional 速度更快 代码更少(增加了新的语法Lambda表达式) 强大的S ...

  7. Java编程思想 第十三章:字符串

    1.不可变String String对象是不可变的,每一个看似修改了String值的方法,实际上都是创建了一个全新的String对象. public class Immutable {public s ...

  8. Java剪切板操作大全

    转载自   Java剪切板操作大全 1. 概述 提起剪切板,一般都是在桌面系统或工具中使用.目前,操作Java剪切板有两种形式,这也对应着两种不同的技术Swing和JavaFX. 而剪切板有可以分为系 ...

  9. Java 8的烹调方式– Lambda项目

    什么是project lambda :Project lambda是用于以Java语言语法启用lambda表达式的项目. Lambda表达式是功能编程语言(如lisp)中的主要语法. Groovy将是 ...

  10. 字符串操作截取后面的字符串_对字符串的5个必知的熊猫操作

    字符串操作截取后面的字符串 We have to represent every bit of data in numerical values to be processed and analyze ...

最新文章

  1. Bagging与随机森林算法原理小结
  2. python私有函数
  3. python 中使用 global 引发了莫名其妙的问题
  4. html在分页功能中如何实现当前页面的页码样式与其他页面不同_如何使用word文档?word文档使用技巧教程?...
  5. oracle和mysql登录方式_使用普通方式和连接池方式获取Oracle和Mysql链接
  6. java实现大整数的加减乘除法(百练OJ:2736、2737、2980、2981)
  7. bzoj千题计划213:bzoj2660: [Beijing wc2012]最多的方案
  8. php 价格计算方法,PHP算法逻辑:如何计算购买量?
  9. super 关键字的使用及说明
  10. Linux 开源 ssh 工具,【原创开源】jssh linux scp ssh 免密登录工具
  11. 我的世界如何安装java环境变量_JDK安装与环境变量配置方法
  12. ISO9001质量管理体系申请条件以及认证流程
  13. 图像导入裁剪与灰度化
  14. java源文件基本布局结构_请调试课本 “第117页”5.4.1节 菜单资源 的代码, 并将程序运行的屏幕截图 和 核心源代码的截图(布局文件,菜单资源文件,Java文件,程序结构图等)提交。...
  15. CUDA+OpenCV 绘制朱利亚(Julia)集合图形
  16. [JZOJ6080]【GDOI2019模拟2019.3.23】IOer【生成函数】【数学】
  17. win10的计算机用户名怎么改,win10账户名修改,教您win10怎么更改账户名称
  18. 超详细TMS-EEG数据处理教程(下)
  19. itsm安装部署(Vmware)
  20. 算法与数据结构实战实验——线性数据结构实现与应用(使用java)

热门文章

  1. OC语言之Protocol基本使用
  2. 计算机考试电子档照片,电子版照片是啥意思???
  3. SAI v2.0小巧强大的板绘工具
  4. 网易云kali linux工具,在kali下如何安装网易云音乐
  5. mix2线刷开发板救砖_小米MIX2原版固件刷机包下载_小米MIX2线刷官方系统升级包...
  6. 吴恩达深度学习课程练习题汇总(第二周)
  7. MATLAB 2018
  8. python车牌识别使用训练集_TensorFlow车牌识别完整版代码(含车牌数据集)
  9. Maven下载安装旧版本
  10. 出生就遇浏览器大战,亲爹还不爱,命运坎坷的JavaScript终于苦尽甘来