你还在Java8中使用循环语句吗?

转载自   你还在Java8中使用循环语句吗?

Java 8中的新功能特性改变了游戏规则。对Java开发者来说这是一个全新的世界,并且是时候去适应它了。

在这篇文章里,我们将会去了解传统循环的一些替代方案。在Java 8的新功能特性中,最棒的特性就是允许我们去表达我们想要完成什么,而不是要怎样做。这正是循环的不足之处。要确保循环的灵活性是需要付出代价的。return、break 或者 continue都会显著地改变循环的实际表现。这迫使我们不仅要清楚我们要实现怎样的代码,还要了解循环是怎样工作的。

现在我们看看怎样把这些循环转换为更简洁,可读性更高的代码。

 

代码转换

好吧,讲的够多了,是时候展示一些例子了!

这次我们要以文章为例子。一篇文章拥有一个标题,一个作者和几个标签。

private class Article {private final String title;private final String author;private final List<String> tags;private Article(String title, String author, List<String> tags) {this.title = title;this.author = author;this.tags = tags;}public String getTitle() {return title;}public String getAuthor() {return author;}public List<String> getTags() {return tags;}
}

每个例子都会包含一个使用传统循环的方案和一个使用Java 8新特性的方案。

在第一个例子里,我们要在集合中查找包含“Java”标签的第一篇文章。

看一下使用for循环的解决方案。

public Article getFirstJavaArticle() {for (Article article : articles) {if (article.getTags().contains("Java")) {return article;}}return null;
}

现在我们使用Stream API的相关操作来解决这个问题。

public Optional<Article> getFirstJavaArticle() {  
return articles.stream().filter(article -> article.getTags().contains("Java")).findFirst();
}

是不是很酷?我们首先使用 filter 操作去找到所有包含Java标签的文章,然后使用 findFirst() 操作去获取第一次出现的文章。因为Stream是“延迟计算”(lazy)的并且filter返回一个流对象,所以这个方法仅在找到第一个匹配元素时才会处理元素。

现在,让我们获取所有匹配的元素而不是仅获取第一个。

首先使用for循环方案。

public List<Article> getAllJavaArticles() {List<Article> result = new ArrayList<>();for (Article article : articles) {if (article.getTags().contains("Java")) {result.add(article);}}return result;
}

使用Stream操作的方案。

public List<Article> getAllJavaArticles() {  return articles.stream().filter(article -> article.getTags().contains("Java")).collect(Collectors.toList());}
}

在这个例子里我们使用 collection 操作在返回流上执行少量代码而不是手动声明一个集合并显式地添加匹配的文章到集合里。

到目前为止还不错。是时候举一些突出Stream API强大的例子了。

根据作者来把所有的文章分组。

照旧,我们使用循环方案。

public Map<String, List<Article>> groupByAuthor() {Map<String, List<Article>> result = new HashMap<>();for (Article article : articles) {if (result.containsKey(article.getAuthor())) {result.get(article.getAuthor()).add(article);} else {ArrayList<Article> articles = new ArrayList<>();articles.add(article);result.put(article.getAuthor(), articles);}}return result;
}

我们能否找到一个使用流操作的简洁方案来解决这个问题?

public Map<String, List<Article>> groupByAuthor() {  return articles.stream().collect(Collectors.groupingBy(Article::getAuthor));
}

很好!使用 groupingBy 操作和 getAuthor 方法,我们得到了更简洁、可读性更高的代码。

现在,我们查找集合中所有不同的标签。

我们从使用循环的例子开始。

public Set<String> getDistinctTags() {Set<String> result = new HashSet<>();for (Article article : articles) {result.addAll(article.getTags());}return result;
}

好,我们来看看如何使用Stream操作来解决这个问题。

public Set<String> getDistinctTags() {  return articles.stream().flatMap(article -> article.getTags().stream()).collect(Collectors.toSet());
}

棒极了!flatmap 帮我把标签列表转为一个返回流,然后我们使用 collect 创建了一个集合作为返回值。

以上的就是如何使用可读性更高的代码代替循环的例子。很高兴您能够用心读完,希望对您有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hadoop fs -ls / 出现WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform

Hadoop fs -ls / 出现WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable问题 配置完hadoop启动的时候出现如下警告信息&#xff1a; WARN util.NativeCodeLoader: Unable to load native-…

阅读器关闭时尝试调用Read无效时的解决方法

今天在写asp .netmvc的项目时&#xff0c;发现了个困扰我很久的问题&#xff0c;经过仔细研究终于解决了。 问题如下&#xff1a; 首先来看一下原来有问题的代码&#xff1a; public static SqlDataReader Excutereader(string sql,params SqlParameter [] param) {using (SqlC…

.NET或将引入类型类和扩展

类型类是另外一项正被考虑引入.NET未来版本的特性。在提案“外观和扩展&#xff08;Shapes and Extensions&#xff09;”中&#xff0c;该特性被称为外观&#xff0c;它们将大幅提升.NET泛型的能力。Mads Torgersen这样描述类型类&#xff1a; 接口抽象的是作为类型实例的对象…

成为更优秀的程序员:退后一步看问题

转载自 成为更优秀的程序员&#xff1a;退后一步看问题 一天&#xff0c;在工作中… Bug #3890 来自客户&#xff1a; 有个程序出现了错误&#xff0c;程序提示说“SpeedCalculator::compute()里出现了除零情况”。 请尽快修复&#xff01; 你打开SpeedCalculator.php&#…

JAVA生成随机数

方式一 Random rand new Random();for(int i0; i<10; i) {System.out.println(rand.nextInt(10) 1);}方式二 for (int i 0; i < 50; i) {arr[i](int)(100*Math.random());}

深夜福利, 小试linuxkit

前言 今天小编的朋友圈被DockerCon和linuxkit刷屏了&#xff0c;再不出来写点linuxkit的东东恐怕就要跟不上时代了。小编翻阅了N多的有关linuxkit的文章&#xff0c;发现绝大多数都是英文的讲解&#xff0c;小编本着对读者负责的态度决定先将linuxkit的文章翻译成中文&#xff…

HBase的hbase shell 详解

进入hbase命令行 ./hbase shell 显示hbase中的表 list 创建user表&#xff0c;里面包含info&#xff0c;date两个列族 create user,info,data create user,{NAME > info, VERSIONS > 5},{NAME > data , VERSIONS > 5 } 插入数据 puthbase> put ns1:t1, r1, c1, …

类的无参方法

一、方法&#xff1a; 1.组成&#xff1a;访问修饰符&#xff08;public&#xff09; 返回值类型&#xff08;void,String ,int&#xff09; 方法名&#xff08;采用驼峰命名法&#xff09;(){ //方法体 } eg:public String run(){ //方法体 return “快跑”; } 注意&#xff1…

这些保护Spring Boot 应用的方法,你都用了吗?

转载自 这些保护Spring Boot 应用的方法&#xff0c;你都用了吗&#xff1f; Spring Boot大大简化了Spring应用程序的开发。它的自动配置和启动依赖大大减少了开始一个应用所需的代码和配置量&#xff0c;如果你已经习惯了Spring和大量XML配置&#xff0c;Spring Boot无疑是…

.NET Core 2.0及.NET Standard 2.0

.NET Core 2.0的发布时间&#xff0c;.NET Core 2.0预览版及.NET Standard 2.0 Preview大概在5月中旬或下旬发布。 .NET Core 2.0正式版本发布时间大约在Q3 2017发布&#xff0c;具体我估计大概在8月份左右。同时一起发布的也就是.NET Standard 2.0。 MilestoneRelease Date.…

路径、形状工具与选区

一、路径工具&#xff1a; 可以转换为选区或者使用涂颜色填充和描边的轮廓。 二、路径工具的功能&#xff1a; 1.绘制平滑线条 2.绘制矢量形状 3.勾选图像轮廓 4.选区互换 三、路径工具的分类&#xff1a; 1.路径选择工具&#xff1a;选择一个闭合的路径或者是一个独立存在的路…

zookeeper 屁民

视频链接&#xff1a;https://pan.baidu.com/s/1b_liTHLVCesMWqoZYokxyA 密码&#xff1a;wjgu 视频在 00:31:00–01:03:00之间 Zookeeper Server最基础的东西是什么呢&#xff1f;我想应该是Paxos了。所以本文会介绍Paxos以及它在ZK Server中对应的实现。 先说Paxos&#x…

Linux清理磁盘挂载点方法(亲测有效)

问题现象 Linux操作系统云服务器根目录空间占用率过高。例如&#xff0c;以图1为例&#xff0c;根目录空间占用率为96%。 根目录空间占用率过高 查询当前系统存在一个约42G 大小的文件access_log&#xff0c;这个文件应该是apache产生的访问日志文件&#xff0c;从日志大小来…

.NET程序在Linux容器中的演变

本文将首先讨论镜像的构建时间和启动时间&#xff0c;接着会将一个简单的.NET程序运行在基于容器的应用上&#xff0c;然后观察镜像大小的变化&#xff0c;最终缩短镜像的构建和加载时间。此外&#xff0c;代码优化是本文的另一个主题。 现在&#xff0c;.NET开发人员可以无障…

滤镜与通道

一、滤镜&#xff1a;在原有图像的基础上&#xff0c;产生许多离奇而炫目的效果的工具集合。 二、滤镜分为两个部分&#xff1a; 1.内置的滤镜 2.外挂滤镜 三、滤镜组&#xff1a; 1.渲染&#xff1a;可以在图像中创建三维形状&#xff0c;云彩图案和三维光照效果。 2.风格化&a…

Zookeeper 详讲(笔记)1

client发送request给follower,follower将request给leader&#xff0c;leader将proposal&#xff08;提议&#xff09;发送给所有的follower&#xff0c;follower进行投票&#xff0c;每一个follower返回一个ack给Leader&#xff0c;leader将commit发送给所有的follower进行更新…

React的列表渲染

//9. 列表渲染class List extends React.Component{state {list:[1,2,3,4,5],list2:[{id:1,text:java},{id:2,text:js},{id:3,text:php},{id:4,text:python},{id:5,text:node}]}render(){const arr this.state.list;const arr2 this.state.list2;const listItem []const li…

Spring-SpringMVC父子容器

转载自 Spring-SpringMVC父子容器 前言 Spring&SpringMVC作为bean管理容器和MVC默认框架&#xff0c;是大多数web应用都会选择的方案。在其使用过程中&#xff0c;尽管基于xml的配置bean管理的方式依然存在&#xff0c;但在很多情况下已经采用的强大的注解功能将其替代。…

微服务的概念——《微服务设计》读书笔记

《领域驱动设计》&#xff08;Eric Evans&#xff09;&#xff1a;告诉我们用代码呈现真实世界的重要性&#xff0c;并且告诉我们如何更好地建模。 持续交付理论&#xff1a;如何更有效及更高效地发布软件品&#xff0c;并指出保持每次提交均可发布的重要性。 六边形架构理论&a…