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代替字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web漏洞扫描器—AWVS
- 下一篇: JBoss主要版本下载链接一览