【发布时间】:2014-05-08 18:56:46
【问题描述】:
在 Java 8 中,选择使用函数式接口而不是普通方法调用对性能有何影响?
假设我必须多次调用一个方法,并为其 5 个参数中的 3 个使用重复值:
boolean isGood = getIsGood();
boolean isOk = getIsOk();
int year = getYear();
processCitiesByYear("Germany", "Berlin", isGood, isOk, year);
processCitiesByYear("USA", "New York City", isGood, isOk, year);
processCitiesByYear("Italy", "Rome", isGood, isOk, year);
processCitiesByYear("Japan","Tokyo", isGood, isOk, year);
processCitiesByYear("Canada","Montreal", isGood, isOk, year);
processCitiesByYear("Spain","Madrid", isGood, isOk, year);
我可以创建一个java.util.function.BiConsumer 以避免“isGood, isOk, year”重复,并使代码更具可读性(恕我直言):
boolean isGood = getIsGood();
boolean isOk = getIsOk();
int year = getYear();
BiConsumer<String, String> processGoodAndOkInYear=
(country, city) -> {
processCitiesByYear(country, city, isGood, isOk, year);
};
processGoodAndOkInYear.accept("Germany", "Berlin");
processGoodAndOkInYear.accept("USA", "New York City");
processGoodAndOkInYear.accept("Italy", "Rome");
processGoodAndOkInYear.accept("Japan","Tokyo");
processGoodAndOkInYear.accept("Canada","Montreal");
processGoodAndOkInYear.accept("Spain","Madrid");
这种“设计模式”是否会严重牺牲性能?或者 JVM 是否神奇地 turns my processGoodAndOkInYear into compiled code 并证明它实际上比 5 个参数调用更有效?
【问题讨论】:
-
你自己分析后得到了什么结果?
-
好问题。我认为答案最好用一句荷兰谚语来概括:“meten is weten”。基本上:确定,测量它!
-
起初我想进行测量,但后来我注意到参数的数量(重复和不重复)、方法调用的数量、功能接口的组合(比如 BiFunction, Predicate
>)... 我相信了解内部工作原理可以更好地回答我对整体“设计模式”的疑问。
标签: java performance lambda