如何获得Function的表达式

为了做一个简单的测试,测试不同实现方法的执行效率,不同方法用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的方法

阅读 2.1k
1 个回答

我并没有在function中找到类似于getCanonicalName()的method,而且我认为也不会出现这类的方法

因为在我看来,lambda将一个method包装,而执行者只需要执行这个符合入参标准的method即可,对于是哪个method是不需要关心的。

如果真的需要识别出”多态“的lambda具体是谁,那可以考虑封装为class,而不是用lambda。

我不认为轻量的lambda需要具有过多的field描述自己,只是个人看法,勿喷

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进