文档章节

Java8 lambda第一弹

零二一七
 零二一七
发布于 2017/08/28 22:12
字数 501
阅读 67
收藏 1

何为lambda?

(Computer c1, Computer c2) -> c1.getPrice().compareTo(c2.getPrice());

上面是一个lambda表达式,等价于匿名内部类:

new Comparator<Computer>() {
        @Override
        public int compare(Computer c1, Computer c2) {
            return c1.getPrice().compareTo(c2.getPrice());
        }
};

Q:区别在哪呢?

A: 简洁了 (上面的lambda在一个具体的上下文中还可以继续简化)

lambda表达式,可以理解为一种可传递的匿名函数

函数:不像方法一样属于某个类,但有参数列表,返回类型,还可以抛出异常

匿名:没有函数名称

传递:表达式可以作为参数传递

在哪使用?

上面和匿名内部类的对比,不难发现,在一些需要使用匿名内部类的地方,就可以用lambda代替。

Java8中,对lambda的使用做了引导和规范,一般在函数式接口上使用lambda。

函数式接口是什么?

函数式接口就是只定义了一个抽象方法的接口,比如Java8之前就有的Comparator,Runnable

Java8中用注解@FunctionalInterface来标识函数式接口

lambda表达式可以很方便地为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。

当然你可以说,用匿名内部类也可以搞定这一切,没错,以下2种方式均可实现Computer的排序:

computerList.sort(new Comparator<Computer>() {
            @Override
            public int compare(Computer c1, Computer c2) {
                return c1.getPrice().compareTo(c2.getPrice());
            }
});
computerList.sort((c1, c2) -> c1.getPrice().compareTo(c2.getPrice()));

 Java 引入lambda,绝不是为了替代匿名内部类那么简单。lambda是一个利器,为一些创新的思想做好了基本的铺垫,比如Java8引入的Stream,管中窥豹一下:

computerList.stream() //流化
    .filter(c -> c.getPrice() < 5000) //价格<5000
    .sorted(Comparator.comparing(Computer::getPrice).reversed()) //降序
    .limit(2) //取前2个记录
    .map(Computer::getCode) //提取电脑编号
    .collect(Collectors.toList()); //汇总成List

想象一下:如果用面向对象处理,需要多少行?需要声明多少个中间变量?

© 著作权归作者所有

零二一七
粉丝 39
博文 63
码字总数 30828
作品 0
海淀
程序员
java8新特性(二)_lambda表达式

最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看《写给大忙人看的JavaSE8》.这里...

阳光温暖
08/04
0
0
spark2.x由浅入深深到底系列六之RDD 支持java8 lambda表达式

学习spark任何技术之前,请正确理解spark,可以参考:正确理解spark 我们在 http://7639240.blog.51cto.com/7629240/1966131 中已经知道了,一个scala函数其实就是java中的一个接口,对于jav...

tangweiqun
2017/09/20
0
0
Java8实战 — Lambda表达式详解

Lambda管中窥豹 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数、函数主体和返回类型,可能还有一个可以抛出的异常列表。 何为更简介,做一个例子,...

杰克鹏仔
2016/12/27
16
0
30分钟入门Java8之方法引用

30分钟入门Java8之方法引用 作者:@JohnTsai 本文为作者原创,转载请注明出处:https://www.cnblogs.com/JohnTsai/p/5806194.html 30分钟入门Java8之方法引用 前言 之前两篇文章分别介绍了J...

spinachgit
01/12
0
0
Java8 Lambda表达式

函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在,所以放在最开始讨论。FI的定义其实很简单:任何接口,如果只包含唯一一个抽象方法,那...

mifans
2016/11/02
19
0

没有更多内容

加载失败,请刷新页面

加载更多

面向对象设计原则(OOP)

单一职责原则(Single responsibility principle)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。 核心原则:低耦合,高内聚。 一个类,应该只有一个引起它变化的原因,也就是...

gackey
50分钟前
4
0
C++ 锁

C++提供了两种常用的锁,std::lock_guard<Lockable &T>和std::unique_lock<Lockable &T>。通常使用场景下,这两个锁用法一致。即,在构造锁对象时上锁,在析构锁对象时解锁。使用户从上锁/解...

yepanl
54分钟前
2
0
Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
2
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
4
0
TiDB 在爱奇艺的应用及实践

爱奇艺,中国高品质视频娱乐服务提供者,2010 年 4 月 22 日正式上线,推崇品质、青春、时尚的品牌内涵如今已深入人心,网罗了全球广大的年轻用户群体,积极推动产品、技术、内容、营销等全方...

TiDB
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部