Java8的Lambda 表达式

栏目: 编程语言 · Java · 发布时间: 5年前

内容简介:Java8的Lambda 表达式Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。Lambda 表达式其实是一个匿名函数。一、演变过程

Java8的Lambda 表达式

Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。Lambda 表达式其实是一个匿名函数。

一、演变过程

1.普通方法的写法

定义一个Hero对象,存储英雄的属性

public class Hero implements Comparable<Hero> {
    /**
     * 英雄名
     */
    public String name;
    /**
     * 血量
     */
    public float hp;
    /**
     * 伤害
     */
    public int damage.......

筛选出,满足下面条件的英雄类

private static void filter(List<Hero> heros) {
    for (Hero hero : heros) {
        if (hero.hp > 100 && hero.damage < 50)
            System.out.print(hero);
    }
}

这种方式,如果筛选条件改变,需要重新再写一个方法,稍微麻烦一点。

2.匿名方法的写法

定义一个接口,接口的方法是判断是否满足的条件。

public interface IHeroChecker {
    /**
     * 判断Hero是否满足条件
     * @param h
     * @return
     */
    public boolean checker(Hero h);
}

写一个过滤方法,判断条件是调用IHeroChecker对象的checker方法,其实就是这个方法中要使用另一个类的方法。

private static void filter(List<Hero> heros,IHeroChecker checker) {
    for (Hero hero : heros) {
        if(checker.checker(hero))
        System.out.print(hero);
    }
}

//匿名类对实现此判断方法
IHeroChecker checker = new IHeroChecker() {
    @Override
    public boolean checker(Hero h) {
        return (h.hp>100 && h.damage<50);
    }
};
filter(heros,checker);

使用匿名类实现这个方法,再调用filter方法

3.Lambda 表达式的写法

使用Lambda 表达式就不用写匿名类了,将匿名类演变成Lambda表达式;

1.把匿名类外面的壳子去掉,只保留方法参数和方法体;

2.参数和方法体之间加上符号 ->

3.把return和{}去掉

4.只有一个参数时可以去掉();

//匿名类对实现此判断方法
IHeroChecker checker = new IHeroChecker() {
    @Override
    public boolean checker(Hero h) {
        return (h.hp>100 && h.damage<50);
    }
};

 filter(heros,h->h.hp>100 && h.damage<50);

二、与匿名方法关系

与匿名类概念相比较,Lambda 其实就是匿名方法,这是一种把方法作为参数进行传递的编程思想。java执行时,还是会将他变成匿名类的.

三、Lambda表达式弊端

1.可读性差,匿名类代码结构比较起来,Lambda表达式一旦变得比较长,不好理解;

2.不便于调试,很难在Lambda表达式中增加调试信息;

3.版本支持,在JDK8以后才有,之前的版本不支持。

四、Lambda表达式方法的引用

前面我们讲了,Lambda表达式其实就是一个方法,把{}和return去掉了而已,那我们如果有现成的方法,用已有的方法代替它该怎么做

1.引用静态方法

已经有了静态方法

public static boolean checker(Hero h) {
    return h.hp>100 && h.damage<50;
}

在Lambda表达式中使用

filter(heros, h -> LambdaTest.checker(h) );

直接引用

filter(heros, LambdaTest::checker);

2.引用对象的方法

引用LambdaTest对象中testHero方法

LambdaTest lambdaTest = new LambdaTest();
filter(heros, lambdaTest::testHero);

3.引用容器对象的方法

在Hero对象中有

private boolean matched(){
    return (hp > 100 && damage < 50);
}

在Lambda表达式中使用

filter(heros, h -> h.matched());

直接引用

filter(heros, Hero::matched);

五、总结

可以认为Lambda表达式可以看做是一个方法,我们把这个方法直接可以传递到另一个方法中。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计心理学

设计心理学

Donald Norman / 梅琼 / 中信出版社 / 2003-10-1 / 23.00

设计心理学,ISBN:9787800739255,作者:(美)唐纳德·A.·诺曼(Donald A. Norman)著;梅琼译;梅琼译一起来看看 《设计心理学》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具