`
qingyu11068
  • 浏览: 63262 次
文章分类
社区版块
存档分类
最新评论

JAVA 8入门(一)Lambda表达式

阅读更多

机房迁移以后终于可以用上 Java 8了,本教程将会分为三个方面介绍Java 8 的新特性。首先给大家介绍 Java 8 的Lambda 表达式。

1. 让代码更灵活

作为程序员,每天除了写代码,最重要的事情就是吃饭了,为了吃饭,我们设计了一个Dish 对象,代码如下:

public classDish{

    private final String name;
    private final boolean vegetarian;
    private final int calories;
    private final Type type;
    
    public enum Type {MEAT,FISH,OTHER}
    
    //省略官网:www.fhadmin.org get set方法
}

作为一个减肥人士,寻求医生建议。医生说,低卡路里饮食,比较健康,为了找出卡路里低于1000的菜品。于是就有了一下代码:

public static List<Dish> filterDish(List<Dish> dishes){
    List<Dish> healthDishes = new ArraryList<>();
    for(Dish dish: dishes){
        if(dish.getCalories()<1000){
            healthDishes.add(dish)
        }
    }
}

后来医生说,不只卡路里要低,而且肉就不要吃了,吃素比较有利于健康,于是含泪写了以下代码:

public static List<Dish> filterDish(List<Dish> dishes){
    List<Dish> healthDishes = new ArraryList<>();
    for(Dish dish: dishes){
        if(dish.getCalories()<1000 && dish.getVegerarian()){
            healthDishes.add(dish)
        }
    }
}

不能吃肉哪憋得住,于是医生又说你可以吃一点鱼。最为一个有骨气的程序员,已经不想去迎合(产品经理了)医生去修改代码了官网:www.fhadmin.org?有没有什么办法,能快速找出健康食物,万一哪天减肥成功了,又能吃肉了也不用去修改代码?
于是我们写这样一段代码:

public static List<Dish> filterDish(List<Dish> dishes,int calorites,boolean isMeat,Type type){
    List<Dish> healthDishes = new ArraryList<>();
    for(Dish dish: dishes){
        if(dish.getCalories()<calorites 
            && dish.getVegerarian() == isMeat
            && dish.getType() == type ){
            healthDishes.add(dish)
        }
    }
}

需求是满足了,但是作为一个有品位的程序员肯定不允许这样代码出现,实在过于繁琐了。万一再加入一个条件怎么办?
我们可以考虑将医生的医嘱作为一个方法传入我们的filerDish这个方法,医生说啥就是啥,不必要自己封装一个方法来响应医生的要求?于是我们这么考虑:

首先规定一个接口叫”医生说”:

public interfaceDoctorSaid{
    booleantest(Dish dish);
}

我们挑选菜品的时候这样写:

public static List<Dish> filterDish(List<Dish> dishes,DoctorSaid doctorSaid){
    List<Dish> lowCaloriesDishes = new ArraryList<>();
    for(Dish dish: dishes){
        if(doctorSaid.test(dish) ){
            healthDishes.add(dish)
        }
    }
}

如果医生说吃 1000 卡路里一下的食物,我们实现一个1000 以下卡路里的食物:

public classDoctorSaidLowCaloritesimplementsDoctorSaid{
    booleantest(Dish dish){
        return dish.getCalorites() < 1000;
    }
}

这样我们只用这样调用filterDish就解决问题了:

List<Dish> dishes = filterDish(dishes,new DoctorSaidLowCalorites());

问题来了,对于善变的(产品经理) 医生,总是不能提前准备好所有的接口实现?
这个时候我们就可以使用JAVA的匿名了内部类来使用这个挑选菜品的方法更加灵活。于是我们就有这样的代码了

List<Dish> dishes = filterDish(dishes,new DoctorSaid(){
    return dish.getCalorites() < 1000;
});

稍微好了一点,但是匿名内部类还是有一个不好的地方,就是太啰嗦了其实核心代码就是dish.getCalorites() < 1000 为什么我们要写那么多代码?这个也是java老被诟病的地方,代码十分繁琐。
终于我们的Lambda表达式要出场了:

List<Dish> dishes = filterDish(dish, (Dish dish)-> dish.getCalorites() < 1000);

现在看上去好多了,官网:www.fhadmin.org 但是作为一个程序员还是很贪心啊,现在只能过滤 Dish 能不能再抽象一点呢?当然啊,看这个:

public interfacePredicate<T>{
    boolean test(T t);
}

public static <T> List<T> filter(List<T> list, Predicate<T> p){
    List<T> result = new ArrayList<>();
    for(T e: list){
        if(p.test(e)){
            result.add(e);
        }
    }
    return result;
}

使用泛型让我们的代码更加通用。随便产品经理改需求,从 List 里面按规则过滤符合要求的需求不用多写代码都能搞定了。这时候你是不是觉得胸前的红领巾更加鲜艳了?

2. 实际应用:

作为一个招聘网站的程序员,一定有很多将职位列表排序的需求,比如按照更新时间将职位列表排序我们可以这么写:


jobList.sort((JobInfo job1,JobInfo job2)->job1.getUpdateTime.compareTo(job2.getUpdateTime);

或者作为高端程序员的多线程可以这样写:

    Thread t = new Thread(()-> System.out.println("Hello world"));

3. 近距离观察Lambda

1. 什么是Lambda

所以通过上面例子我们尝试定义一下Lambda 表达式是什么?

Lambda表达式为简洁的表示可传递的匿名函数的表达式的一种方式。分开来说:

  • 匿名:没有必要给他取一个函数名称。
  • 简洁:相对于匿名内部内不需要写很多模板代码
  • 传递:可以做为参数传递给方法
  • 函数:不属特定类。但是和方法一样,有参数,函数主题,返回值,有时候还能抛异常。

标准的Lambda表达式:

(Dish dish) -> dish.getCalories() > 1000;

从上面的标准的表达式:一共三个部分组成
* 参数:
* 箭头:
* Lamdba主体:也就是函数的主体

2. 什么时候使用Lambda

  • 函数式接口:

所谓函数式接口,我们可以理解为就是只有一个方法的接口。

  • 函数描述符:

函数式接口的签名基本上就是Lambda表达式的签名。我们降这种抽象方法叫做函数描述符。举个例子,Ruannable 方法就可以看做一个什么都不接受,什么都不返回的函数。这个时候我们可以发现传入的 Lambda 函数为 ()->void.

3. Lambda的类型推断

Java编译器会根据上下文推断使用什么函数式接口来配合Lambda表达式,比如我们之前的例子,以下两种写法都是正确的:

(Dish dish) -> dish.getCalories() > 1000;

dish -> dish.getCalories() > 1000;

第二个语句并没有显式的制定dish的类型是Dish,编译器也能正确的编译代码。

4.方法的引用

在Lambda中我们可以利用方法的引用来重复使用。可以认为是一个Lamdba带来的语法糖

分享到:
评论

相关推荐

    Java的lambda表达式讲解代码(各种lambda表达式使用方式:无参、一个参数、多参数、简化形式...)

    1、函数式编程入门:通过阅读本源码资源,可以快速掌握Lambda表达式的基本语法和特性,为进一步学习函数式编程打下基础。 2、提高代码可读性:使用Lambda表达式可以减少样板代码,并使代码更加简洁和易读。本源码...

    Lambda表达式和stream流的入门

    Lambda表达式和stream流的入门 java 响应式编程

    Lambda表达式--凌尘.pptx

    Lambda入门介绍

    一文带你入门JDK8新特性——Lambda表达式

    主要介绍了JDK8新特性——Lambda表达式的相关资料,帮助大家更好的理解和学习JAVA开发,感兴趣的朋友可以了解下

    30分钟入门Java8之lambda表达式学习

    本篇文章主要介绍了30分钟入门Java8之lambda表达式学习,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    快速入门Java中的Lambda表达式

    Lambda作为函数式编程中的基础部分,在其他编程语言中早就广为使用,但在Java领域中发展较慢,直到java8,才开始支持Lambda。网上关于Lambda的教程很多,今天小编给大家分享一篇快速入手Lambda的教程。

    Java Lambda表达式入门示例

    主要介绍了Java Lambda表达式,结合简单实例形式分析了Lambda表达式功能、原理、用法及相关操作注意事项,需要的朋友可以参考下

    Java8 新特性之lamdba表达式和Optional

    1 Lambda表达式 2 1.1 Lambda语法糖 2 1.1.1 语法 2 1.1.2 Lambda表达式可使用的变量 3 1.1.3 lambda表达式中的this概念 3 1.2 函数式接口- Consumer/Predicate/Function/Supplier 4 1.1.4 什么是函数式接口 4 1.1.5...

    Lambda表达式和StreamAPI学习总结.pdf

    Java8新特性初级入门学习

    尚硅谷Java视频Java8新特性视频教程

    尚硅谷Java视频Java8新特性视频教程,本Java视频涵盖了 Java8 的所有新特性:Lambda表达式、强大的 Stream API、全新时间日期 API、ConcurrentHashMap、MetaSpace。Java8 的新特性使 Java 的运行速度更快、代码更少...

    30分钟入门Java8之方法引用学习

    在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法,这篇文章主要介绍了30分钟入门Java8之方法引用学习,有兴趣可以了解一下。

    JAVA学习视频之Java8高级编程(2)

    JAVA学习视频系列Java8编程入门-面向对象编程-高级编程之Java8高级编程(2) Java作为一种面向对象的编程语言,具有强大的跨平台性和丰富的开发工具和框架支持。在我们日常的软件开发过程中,高级编程技术在提升效率...

    JAVA学习视频之Java8高级编程(1)

    JAVA学习视频系列Java8编程入门-面向对象编程-高级编程之Java8高级编程(1) Java作为一种面向对象的编程语言,具有强大的跨平台性和丰富的开发工具和框架支持。在我们日常的软件开发过程中,高级编程技术在提升效率...

    JAVA学习视频之Java8高级编程(3)

    JAVA学习视频系列Java8编程入门-面向对象编程-高级编程之Java8高级编程(3) Java作为一种面向对象的编程语言,具有强大的跨平台性和丰富的开发工具和框架支持。在我们日常的软件开发过程中,高级编程技术在提升效率...

    Java8、9特性入门课程视频

    Java8、9特性入门课程视频:1.Lambda表达式,2.函数式编程。。。

    Xtend官方文档-第一章-入门

    其 语法和语义构成基于 Java 编程语言,但在许多方面得到改进: 扩展方法 - 增强封闭类型新功能 Lambda表达式 - 简洁的匿名函数常量语法 ActiveAnnotations (积极的注解 )-注解处理的增强因子 运算符重载 - 使您的...

    写给大忙人看的Java核心技术.[美]Cay S. Horstmann(带详细书签) PDF 下载 高清 完整版

    以全局高度提炼语言精髓,以高浓度、高含金量的方式对Java 8新特性进行细致讲解,将其沉浸于Java多年的真知灼见蕴藏于书中,既扎实覆盖Java编程的基础知识,更独具匠心地从Java 8极其重要的新特性之一lambda表达式发...

    写给大忙人看的Java核心技术 高清(带目录)PDF

    以全局高度提炼语言精髓,以高浓度、高含金量的方式对Java 8新特性进行细致讲解,将其沉浸于Java多年的真知灼见蕴藏于书中,既扎实覆盖Java编程的基础知识,更独具匠心地从Java 8极其重要的新特性之一lambda表达式发...

    Java基础最全笔记文档

    4. 日期与时间、日期类、包装类、正则表达式、Arrays 类、常见算法、Lambda 表达式 5. Collection集合、数据结构、List集合、泛型、Set集合、可变参数 6. 集合工具类Collections、Map集合、集合嵌套、不可变集合 7. ...

Global site tag (gtag.js) - Google Analytics