亚游,国台办新闻发言人马晓光曾表示,南沙群岛包括太平岛是中国的固有领土,两岸中国人有责任共同维护祖产。国台办将密切关注有关方面涉及太平岛的动作。

  “和平使命-2012”上海合作组织成员国武装力量联合反恐军事演习当地时间7日下午在塔吉克斯坦胡占德市正式开始。白手起家怎样创业  上海飞机设计研究院总体气动设计研究部部长黄炜介绍说,C919以追求安全、舒适、经济和环保为目标。

发布于 2016-07-21 06:36:25 | 208 次阅读 | 评论: 3 | 来源: 网友投递

这篇文章主要介绍了Java函数式编程(六):Optional,本文是系列文章的第6篇,其它文章请参阅本文底部的相关文章,需要的朋友可以参考下

选取单个元素

直觉来说选取单个元素肯定会比选取多个要简单得多,不过这里也存在一些问题。我们先看下一般的做法的问题是什么,然后再看下如何用lambda表达式来解决它。

我们先新建一个方法来查找一个以特定字母开头的元素,然后打印出来。



public static void pickName(

final List<String> names, final String startingLetter) {

String foundName = null;

for(String name : names) {

if(name.startsWith(startingLetter)) {

foundName = name;

break;

}

}

这个方法简直跟刚过去的垃圾车一样臭不可闻。我们先是新建了一个foundName的变量,然后初始化成null——这个就是恶臭之源。我们不得不检查是否为空,不然的话就会抛出一个NullPointerException或者一个错误响应。我们还用了一个外部迭代器来循环列表,如果找到了想要的元素之后还得跳出这个循环,这又加重了原来的臭味:基本类型偏执,命令式风格,可变性,全齐活了。一旦退出循环后,我们还得先检查下结果,然后才能进行打印。这么点任务居然写了这么长的代码。

我们来重新分析下这个问题。我们只是希望能选出第一个匹配的元素,并且能安全的处理不存在这样一个元素的情况。我们来用lambda表达式重写一下这个pickName方法。



public static void pickName(

final List<String> names, final String startingLetter) {

final Optional<String> foundName =

names.stream()

.filter(name ->name.startsWith(startingLetter))

.findFirst();

System.out.println(String.format("A name starting with %s: %s",

startingLetter, foundName.orElse("No name found")));

}

JDK里面一些强大的功能使得这段代码更得非常简洁。首先我们用filter方法获取了所有满足条件的元素,然后用了Stream类的findFirst方法选取出了返回集合的第一个元素。这个方法返回的是一个Optional对象,这就是Java里面官方认证的null变量的除臭剂。

Optional类非常有用,你不用管结果是不是存在。它使得我们免受空指针异常的烦恼,并且更明确的指明了没有结果也是一种可能的结果。通过isPresent()方法我们可以知道结果是不是存在,想获取结果值的话可以使用get()方法。我们还可以使用(这个方法名能让你震惊)orElse方法给它设置一个默认值,就像前面代码里的那样。

我们用之前一直在用的friends集合来验证下我们这个pickName方法。



pickName(friends, "N");

pickName(friends, "Z");


这段代码选取出第一个匹配的元素,如果没找到,打印出一个友好的提示信息。


A name starting with N: Nate

A name starting with Z: No name found


findFirst()方法和Optinal类的结合使用减少了我们的代码量,并且看起来感觉还不错。不过Optional类的功能远不止这些。比如说,除了当对象不存在的时候能提供一个默认值外,如果结果存在的话还可以用它来运行一段代码,或者一个lambda表达式,像这样:


foundName.ifPresent(name -> System.out.println("Hello " + name));

跟命令式的选取第一个匹配名字的代码比起来,流式的优雅的函数式风格看真来更棒一些。不过这个调用流的版本里是不是做的事情有点太多了(译注:先选出了所有匹配的再返回第一项)?当然不是,这些方法非常智能,它们可以按需工作(在后面113页的Stream的惰性求值中我们会深入探讨这点)。

选取单个元素的例子展示了JDK库更多强大的功能,下面我们来看下lambda表达式如何根据一个集合,来求出一个想要的值。

最新网友评论  共有(3)条评论 发布评论 返回顶部
陌非 发布于2017-12-25 17:02:29
感觉是scala编程实战,。。。哈哈
支持(0)  反对(0)  回复
陌非 发布于2017-12-25 11:14:22
感觉是scala编程实战,。。。哈哈
支持(0)  反对(0)  回复
PHPERZ网友 发布于2017-02-16 10:20:16
这是从哪本书上摘录下来的
支持(2)  反对(1)  回复

Copyright © 2007-2017 亚游 All Rights Reserved   冀ICP备14009818号  亚游  广告服务
探探CEO王宇谈陌生人社交:抓住95后的七个关键点 10亿美元收购Ring后 亚马逊又投资一家智能家居厂商 最强连线!山城不只大小摩托 这架轰炸机同样可怕 第16届哈萨克斯坦-中国商品展吸引两百多家中企参展 大华继显:中美不打贸易战 钢铝行业除阴霾 比特币继续上涨 自5月份以来首次突破8000美元 快手稳行:由快到慢 半年内忧外患并存 Lgmi:中美贸易别总拿“钢铁”说事儿 印第安维尔斯赛正赛外卡公布 阿扎布沙尔在列 希腊:瑞士制药商雅典总部办公大楼遭攻击 俄驻英大使:被驱逐的俄外交官将于3月20日离英 切尔西最强的世界级王牌!阿扎尔现在没法和他比
YouTube非法收集儿童数据 隐私保护团体提起指控 摩洛哥万人游行 抗议美驻以大使馆迁至耶路撒冷 [新浪彩票]17日竞彩赔率解读:鹿特丹立于不败 综艺不能有负能量:保证安全播出是最现实首要的事 热身赛-梁佳卉两拒对方点球 中国U20女足5-2英格兰 第二梯队音乐平台体力不支 多米音乐停摆 克洛普:英超5强都有望欧冠晋级 下轮踢谁无所谓 电影院看中超!大连万达影城将直播一方客战上港 政协委员:尽快制定个人信息保护法 追责滥用行为 菲外交部:杜特尔特参加博鳌亚洲论坛开幕式并演讲 金软景偷师中国女排?韩主帅:我看过中国联赛 穆帅:绝不说切尔西人坏话 2次被解雇他们都支持我
人和战上港力求扮演绊脚石 升班马防线顽固底气足 美国政府或一年三停摆 未来发展或依照这五种剧本 佩帅:点球若进会有不同结果 三四支队比我们更强 国侨办主任裘援平访问巴拿马 两次“现场办公” 因受互联网冲击 美国最大电台iHeartMedia宣布… 柯洁传唱经典忆人机大战 坦言:征途不止于此 牛汇:美中贸易争端愈演愈烈 欧洲买家欲低价扫货美豆 这家共享单车正式破产清算 用户可微信申报退押金 张蓓雯有望拿到世锦赛参赛资格 将代表美国参赛 笨蛋也能年赚100万 女人开什么店比较好 现在什么行业挣钱快 怎样白手起家赚钱 亚游