Java 8中的新功能特性改变了游戏规则。对Java开发者来说这是一个全新的世界,并且是时候去适应它了。
在这篇文章里,我们将会去了解传统循环的一些替代方案。在Java 8的新功能特性中,最棒的特性就是允许我们去表达我们想要完成什么而不是要怎样做。这正是循环的不足之处。要确保循环的灵活性是需要付出代价的。return、break 或者 continue都会显著地改变循环的实际表现。这迫使我们不仅要清楚我们要实现怎样的代码,还要了解循环是怎样工作的。
在介绍Java 8的流(Stream)时,我们学会了一些集合操作的实用技巧。现在我们要看看怎样把这些循环转换为更简洁,可读性更高的代码。
开始编码!
好吧,讲的够多了,是时候展示一些例子了!
这次我们要以文章为例子。一篇文章拥有一个标题,一个作者和几个标签。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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循环的解决方案。
1
2
3
4
5
6
7
8
9
10
|
public Article getFirstJavaArticle() {
for (Article article : articles) {
if (article.getTags().contains( "Java" )) {
return article;
}
}
return null ;
} |
现在我们使用Stream API的相关操作来解决这个问题。
1
2
3
4
5
|
public Optional<Article> getFirstJavaArticle() {
return articles.stream()
.filter(article -> article.getTags().contains( "Java" ))
.findFirst();
}
|
是不是很酷?我们首先使用 filter 操作去找到所有包含Java标签的文章,然后使用 findFirst() 操作去获取第一次出现的文章。因为Stream是“延迟计算”(lazy)的并且filter返回一个流对象,所以这个方法仅在找到第一个匹配元素时才会处理元素。
现在,让我们获取所有匹配的元素而不是仅获取第一个。
首先使用for循环方案。
1
2
3
4
5
6
7
8
9
10
11
12
|
public List<Article> getAllJavaArticles() {
List<Article> result = new ArrayList<>();
for (Article article : articles) {
if (article.getTags().contains( "Java" )) {
result.add(article);
}
}
return result;
} |
使用Stream操作的方案。
1
2
3
4
5
|
public List<Article> getAllJavaArticles() {
return articles.stream()
.filter(article -> article.getTags().contains( "Java" ))
.collect(Collectors.toList());
}
|
在这个例子里我们使用 collection 操作在返回流上执行少量代码而不是手动声明一个集合并显式地添加匹配的文章到集合里。
到目前为止还不错。是时候举一些突出Stream API强大的例子了。
根据作者来把所有的文章分组。
照旧,我们使用循环方案。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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;
} |
我们能否找到一个使用流操作的简洁方案来解决这个问题?
1
2
3
4
|
public Map<String, List<Article>> groupByAuthor() {
return articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor));
} |
很好!使用 groupingBy 操作和 getAuthor 方法,我们得到了更简洁、可读性更高的代码。
现在,我们查找集合中所有不同的标签。
我们从使用循环的例子开始。
1
2
3
4
5
6
7
8
9
10
|
public Set<String> getDistinctTags() {
Set<String> result = new HashSet<>();
for (Article article : articles) {
result.addAll(article.getTags());
}
return result;
} |
好,我们来看看如何使用Stream操作来解决这个问题。
1
2
3
4
5
|
public Set<String> getDistinctTags() {
return articles.stream()
.flatMap(article -> article.getTags().stream())
.collect(Collectors.toSet());
} |
棒极了!flatmap 帮我把标签列表转为一个返回流,然后我们使用 collect 去创建一个集合作为返回值。
一切皆有可能
以上的就是如何使用可读性更高的代码代替循环的例子。务必仔细看看Stream API,因为这篇文章仅仅提到它的一些皮毛而已。
相关推荐
Java 8 是 Java 语言的一个重要版本,引入了许多新特性,极大地改变了开发方式。其中最显著的两个特性是接口的增强和Lambda表达式。 一、接口的改变 1. 接口中定义静态方法:在Java 8之前,接口中只能包含抽象方法...
JAVA 1.5的新特性是Java发展史上的一个重要里程碑,这一版本引入了一系列创新特性,旨在提升编程效率、增强代码安全性并简化开发流程。以下是对JAVA 1.5新特性的详细解析: ### 1. 泛型 (Generics) #### 概述 泛型...
Java 8 是一个重要的版本更新,引入了许多新特性,极大地提升了开发效率和代码的可读性。以下将详细讲解其中的一些关键特性。 1. **Lambda 表达式**: - Lambda 表达式允许我们将代码块当作参数传递,简化了匿名...
Java 9是Java语言在2017年推出的版本,这个版本引入了许多新的特性与改进。与之前版本相比,Java 9的升级主要集中在模块化系统,以及对开发者的生产力和平台管理的改进上。由于给定的文件信息中【部分内容】提取的...
Java 8是Java语言发展史上的一次重大更新,它引入了许多新特性,这些特性极大地增强了Java语言的功能,特别是在函数式编程领域。本文将全面解析Java 8的几个关键特性,包括Lambda表达式、函数式接口、方法引用以及新...
### Java 5 新特性详解 #### 一、引言 随着技术的发展,编程语言也在不断地进步和完善。Java 5 的发布标志着 Java 在功能性和便利性方面迈出了重要的一步。本篇文章将详细介绍 Java 5 中的一些关键特性,这些新特性...
Java语言的不断发展带来了许多新特性,使得编程更加高效和安全。以下是这些特性的详细说明: 1. **自动装箱、拆箱**: 自动装箱是指将基本数据类型自动转换为对应的包装类对象,而拆箱则是将包装类对象转换回基本...
For-Each循环(也称为增强For循环)是Java 5引入的新特性,主要用于遍历集合或数组中的每个元素。其语法为: ```java for (类型 变量 : 集合/数组) { // 循环体 } ``` 假设`Demo4.java`演示了使用For-Each...
在Java编程语言中,增强的for循环(也...然而,通过使用额外的变量、自定义迭代器或Java 8的特性,我们可以在保持代码清晰的情况下获取循环中的索引。在实际开发中,我们需要根据项目需求和代码风格选择最适合的方法。
【JAVA8新特性】 Java 8是Java编程语言的一个重大更新,引入了许多创新特性,显著提高了开发效率和代码可读性。其中最重要的新特性之一就是Lambda表达式,它也被称为闭包。Lambda允许我们将函数作为一个方法的参数...
Java 5和Java 6是Java发展史上的两个重要版本,它们引入了许多创新特性,极大地提升了开发效率和程序性能。以下是对这两个版本新特性的详细阐述: ### Java 5新特性 #### 1. **泛型(Generics)** 泛型是Java 5最...
Java 1.7,也被称为Java 7,是Java编程语言的一个重要版本,它引入了许多新的特性和改进,旨在提高开发效率、增强可读性和简化编程任务。在本篇文章中,我们将深入探讨Java 7的一些核心特性,并通过实际代码示例来...
Java增强的for循环 ...Java增强的for循环可以使代码更加简洁,让程序员使用时更加方便,但是也有它的局限性。因此,在实际开发中,需要根据具体情况选择合适的循环方式,不能盲目追求所谓的"新特性"。
Java 8 新特性之 Lambda 表达式和 Optional 类 Java 8 是 Java 语言的最新版本之一,它引入了许多新的特性,包括 Lambda 表达式和 Optional 类,这些特性极大地提高了 Java 语言的编程效率和可读性。下面我们将详细...
Java 5 和 Java 6 是两个重要的 Java 发行版本,它们引入了一系列的新特性和改进,极大地提升了开发效率和代码质量。下面将详细讲解这两个版本的关键特性。 Java 5: 1. **泛型**:泛型允许在类、接口和方法中使用...
对于macOS用户,安装这个JDK版本可以确保他们的开发环境兼容最新的Java特性,并且符合macOS系统的最佳实践。安装过程通常包括解压下载的文件,然后按照指示配置系统路径,确保系统能够找到Java 8的解释器和开发工具...
在本章“数组与方法”中,我们将深入探讨Java如何支持数组以及在新版本中引入的一些特性。以下是对这些知识点的详细阐述: 一、数组的基础概念 1. 定义:数组是一个固定大小的内存块,用于存储同一类型的数据集合。...
### Java 5 新特性详解 #### 一、泛型(Generics) 在 Java 5 中引入的一个重要特性是泛型,这使得开发人员能够在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。 **特点:** - *...