Java 8 学习--lambda表达式的月之暗面

首先推荐各位阅读下面这篇文章。

译文: 如何避免Lambda表达式毁了你的世界

原文: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表达式的写法会出现上述问题, 在你不懂得库用法的时候, 即使使用匿名内部类, 也一样头疼

  1. 当Lambda没有IDE

    对不起, 我没有碰到过写java这种傻瓜语言的还用vim/emacs的傻瓜

上面扯了不少, 其实归根结底java 8 引入lambda表达式是为了让java程序员的生活更美好, 所以请学习它, 并在正确的场合使用它。

参考资料

blog

深入理解Java 8 Lambda(语言篇) 强烈推荐

深入理解Java 8 Lambda(类库篇)

深入探索Java 8 Lambda表达式

书籍

Java 8 函数式编程

写给大忙人看的Java SE 8

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值