首先推荐各位阅读下面这篇文章。
原文:How to avoid ruining your world with lambdas in Java 8
下面所讲都基于上面文章中所涉及到的点
一、 首先看下面的代码:
public class RuinLambdas {
public static void main(String[] args) {
// Easy
startDream(new Dream() {
@Override public void dream() {
// Dream boy, dream ...
}
});
startDream(new AugmentedDream() {
@Override public void dream(String dreamName) {
// Dream boy, dream ...
}
});
// Less easy
startDream(() -> { /* Dream boy, dream ... */ }); //line 1
// And now kid ? ...
startDream((dreamName) -> { /* Dream boy, dream ... */ });
// Do you see which one it is directly by reading this ? ...
startDream((dreamName, duration) -> { /* Dream boy, dream ... */ });
}
public static void startDream(Dream md) { md.dream(); }
//开始做美梦
public static boolean startDream(AugmentedDream ad) {
ad.dream("Ruin lambdas");
return true;
}
//开始做噩梦
public static boolean startDream(ThisIsNightmare hahaha) {
hahaha.sufferMyKid("Hahaha you're going to hell", 2000);
return false;
}
}
interface Dream {
void dream();
}
interface AugmentedDream {
void dream(String dreamName);
}
interface ThisIsNightmare {
void sufferMyKid(String dreamName, int duration);
}
简单总结上面的代码: 三个接口都有dream方法, 而RuinLambdas类有三个名字为startDream的方法重载,参数对应三个接口。
上面代码的问题明显是有问题的,对需要读代码的小伙伴不友好, 我们在coding的时候一定要尽量避免这种状况, 如果可以避免使用相同的方法名, 就尽量避免, 比方可以可以将做美梦和做噩梦的方法分别命名为startAugmentedDream与startNightmareDream.
如果非要写成方法重载, 那么也可以将lambda表达式赋给表意明确的变量, 再将变量传给方法:
AugmentedDream augmentdream = dreamName -> {/* function body */}
startDream(argmentdream);
综上, 可用良好的编码习惯避免上面的问题
二、lambda表达式何时不受欢迎
文中还列举了一些不希望碰到lambda的场景
1. 对于没有接触过lambda表达式的团队成员,突然看到lambda表达式的写法, 极有可能不知所措
但是, 生活本身永远不会像你开着法拉利在空荡的高速公路上畅通无阻, 引导纯洁无知的freshmeat走上灰暗艰难的coding道路也是我等大叔义不容辞的责任
2. 使用maven或gradle管理库依赖,开发中,你一般都没有(去找)你用的库的源代码。当你用了Lamdba这样简洁的语法的时候,你就必须通过浏览API文档来使用这些库了。当你不能理解你使用的库的时候,你可能需要花几个小时去理解库函数做了什么。而Lamdba简洁的语法对你理解这些代码没有任何帮助。
不单单lambda表达式的写法会出现上述问题, 在你不懂得库用法的时候, 即使使用匿名内部类, 也一样头疼
当Lambda没有IDE
对不起, 我没有碰到过写java这种傻瓜语言的还用vim/emacs的傻瓜
上面扯了不少, 其实归根结底java 8 引入lambda表达式是为了让java程序员的生活更美好, 所以请学习它, 并在正确的场合使用它。
参考资料
blog
书籍
Java 8 函数式编程
写给大忙人看的Java SE 8
225

被折叠的 条评论
为什么被折叠?



