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的方法名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值