为了做一个简单的测试,测试不同实现方法的执行效率,不同方法用Function<R,T>来表示,但是不知道怎么输出这个Function的表达式
package com.honey;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
public class ReduceDemo {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c");
// String result = list.stream().reduce((a, b) -> a + "#" + b).get();
// System.out.println(result);
runMultiple(ReduceDemo::reduce1, list);
runMultiple(ReduceDemo::forLoopAdd, list);
}
private static void runMultiple(Function<List<String>, String> f, List<String> list) {
long startMills = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
f.apply(list);
}
System.out.println(f.getClass() + " cost ms: " + (System.currentTimeMillis() - startMills));
}
private static String reduce1(List<String> list) {
String result = list.stream().reduce((a, b) -> a + "#" + b).get();
return result;
}
private static String forLoopAdd(List<String> list) {
StringBuilder sb = new StringBuilder();
sb.append(list.get(0));
for (int i = 1; i < list.size(); i++) {
sb.append("#").append(list.get(i));
}
return sb.toString();
}
}
f.getClass()输出的是类名,类似这种格式,com.honey.ReduceDemo$$Lambda$1/764977973@7b23ec81
就像知道Function有没有类似Canonical的方法
我并没有在function中找到类似于getCanonicalName()的method,而且我认为也不会出现这类的方法
因为在我看来,lambda将一个method包装,而执行者只需要执行这个符合入参标准的method即可,对于是哪个method是不需要关心的。
如果真的需要识别出”多态“的lambda具体是谁,那可以考虑封装为class,而不是用lambda。
我不认为轻量的lambda需要具有过多的field描述自己,只是个人看法,勿喷