java sao_Java SAO操作-使用lambda代替字符串
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代替字符串相关推荐
- Java SAO操作-使用lambda代替字符串
获取lambda的详细信息 要说啥? Java8新增了lambda表达式,最常见的用法是配合Stream做集合操作.下面是一种类似彩蛋的东西可以妙用到某些场合. 一般用法,比如下面这样 Optiona ...
- STL之multiset中equal_range,multimap中的equal_range,bitset容器,string字符串操作,lambda表达式
1multiset中用equal_range来遍历所有的元素 #include <set> #include <iostream> using namespace std ...
- Java Lambda 连接字符串
Java Lambda 连接字符串 public class Menu {/*** 菜品名称*/private String name;/*** 菜品单价*/private Double price; ...
- Java 8th 函数式编程:lambda 表达式
Lambda 表达式是 java 8th 给我们带来的几个重量级新特性之一,借用 lambda 表达式可以让我们的程序设计更加简洁.最近新的项目摒弃了 6th 版本,全面基于 8th 进行开发,本文将 ...
- 【Java 8 in Action】Lambda表达式
文章目录 Lambda表达式 Lambda表达式的介绍 Lambda表达式的语法 Method References Default methods Functional Interface 浅析La ...
- Java 8 新特性之Lambda
Java 8 新特性之Lambda.Stream.Optional Java 8 新特性之Lambda.Stream.Optional 速度更快 代码更少(增加了新的语法Lambda表达式) 强大的S ...
- Java编程思想 第十三章:字符串
1.不可变String String对象是不可变的,每一个看似修改了String值的方法,实际上都是创建了一个全新的String对象. public class Immutable {public s ...
- Java剪切板操作大全
转载自 Java剪切板操作大全 1. 概述 提起剪切板,一般都是在桌面系统或工具中使用.目前,操作Java剪切板有两种形式,这也对应着两种不同的技术Swing和JavaFX. 而剪切板有可以分为系 ...
- Java 8的烹调方式– Lambda项目
什么是project lambda :Project lambda是用于以Java语言语法启用lambda表达式的项目. Lambda表达式是功能编程语言(如lisp)中的主要语法. Groovy将是 ...
- 字符串操作截取后面的字符串_对字符串的5个必知的熊猫操作
字符串操作截取后面的字符串 We have to represent every bit of data in numerical values to be processed and analyze ...
最新文章
- Bagging与随机森林算法原理小结
- python私有函数
- python 中使用 global 引发了莫名其妙的问题
- html在分页功能中如何实现当前页面的页码样式与其他页面不同_如何使用word文档?word文档使用技巧教程?...
- oracle和mysql登录方式_使用普通方式和连接池方式获取Oracle和Mysql链接
- java实现大整数的加减乘除法(百练OJ:2736、2737、2980、2981)
- bzoj千题计划213:bzoj2660: [Beijing wc2012]最多的方案
- php 价格计算方法,PHP算法逻辑:如何计算购买量?
- super 关键字的使用及说明
- Linux 开源 ssh 工具,【原创开源】jssh linux scp ssh 免密登录工具
- 我的世界如何安装java环境变量_JDK安装与环境变量配置方法
- ISO9001质量管理体系申请条件以及认证流程
- 图像导入裁剪与灰度化
- java源文件基本布局结构_请调试课本 “第117页”5.4.1节 菜单资源 的代码, 并将程序运行的屏幕截图 和 核心源代码的截图(布局文件,菜单资源文件,Java文件,程序结构图等)提交。...
- CUDA+OpenCV 绘制朱利亚(Julia)集合图形
- [JZOJ6080]【GDOI2019模拟2019.3.23】IOer【生成函数】【数学】
- win10的计算机用户名怎么改,win10账户名修改,教您win10怎么更改账户名称
- 超详细TMS-EEG数据处理教程(下)
- itsm安装部署(Vmware)
- 算法与数据结构实战实验——线性数据结构实现与应用(使用java)
热门文章
- OC语言之Protocol基本使用
- 计算机考试电子档照片,电子版照片是啥意思???
- SAI v2.0小巧强大的板绘工具
- 网易云kali linux工具,在kali下如何安装网易云音乐
- mix2线刷开发板救砖_小米MIX2原版固件刷机包下载_小米MIX2线刷官方系统升级包...
- 吴恩达深度学习课程练习题汇总(第二周)
- MATLAB 2018
- python车牌识别使用训练集_TensorFlow车牌识别完整版代码(含车牌数据集)
- Maven下载安装旧版本
- 出生就遇浏览器大战,亲爹还不爱,命运坎坷的JavaScript终于苦尽甘来