美文网首页Java
你还在Java8中使用循环语句吗?

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

作者: Java黎先生 | 来源:发表于2018-09-11 16:14 被阅读200次

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

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

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

代码转换

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

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

private class Article {

    private final String title;

    private final String author;

    private final List tags;

    private Article(String title, String author, List tags) {

        this.title = title;

        this.author = author;

        this.tags = tags;

    }

    public String getTitle() {

        return title;

    }

    public String getAuthor() {

        return author;

    }

    public List 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 getFirstJavaArticle() {  

return articles.stream()

    .filter(article -> article.getTags().contains("Java"))

    .findFirst();

}

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

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

首先使用for循环方案。

public List getAllJavaArticles() {

    List result = new ArrayList<>();

    for (Article article : articles) {

        if (article.getTags().contains("Java")) {

            result.add(article);

        }

    }

    return result;

}

使用Stream操作的方案。

public List getAllJavaArticles() {  

    return articles.stream()

        .filter(article -> article.getTags().contains("Java"))

        .collect(Collectors.toList());

    }

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

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

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

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

public Map> groupByAuthor() {

    Map> result = new HashMap<>();

    for (Article article : articles) {

        if (result.containsKey(article.getAuthor())) {

            result.get(article.getAuthor()).add(article);

        } else {

            ArrayList articles = new ArrayList<>();

            articles.add(article);

            result.put(article.getAuthor(), articles);

        }

    }

    return result;

}

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

public Map> groupByAuthor() {  

    return articles.stream()

        .collect(Collectors.groupingBy(Article::getAuthor));

}

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

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

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

public Set getDistinctTags() {

    Set result = new HashSet<>();

    for (Article article : articles) {

        result.addAll(article.getTags());

    }

    return result;

}

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

public Set getDistinctTags() {  

    return articles.stream()

        .flatMap(article -> article.getTags().stream())

        .collect(Collectors.toSet());

}

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

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

Java高架构师、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费学习加群:835638062 点击链接加入群聊【Java高级架构】:https://jq.qq.com/?_wv=1027&k=5S3kL3v

相关文章

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

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

  • python 循环语句

    本次将为大家介绍Python循环语句的使用。Python中的循环语句有 for 和 while。Python循环语...

  • 14、python循环语句

    本章节将为大家介绍Python循环语句的使用。Python中的循环语句有 for 和 while。 while循环...

  • php中while循环语句与do while的区别和用法

    php中while循环语句与do while有什么区别?while循环语句、do while循环语句的使用方法有哪...

  • Python里的循环与迭代函数(上)

    简单的使用for和while语句实现循环 while循环 while语句反复执行循环体中的语句,直到相关表达式求值...

  • Sass 循环语句

    本节我们学习 Sass 中的循环语句,Sass 中的循环语句可以使用 @for 指令和 @while 指令来实现。...

  • Sass 循环语句

    本节我们学习 Sass 中的循环语句,Sass 中的循环语句可以使用 @for 指令和 @while 指令来实现。...

  • 前端

    一.javascript中的for in循环和for循环的使用 JavaScriptfor...in 语句for....

  • C语言学习 - break跳转语句

    break跳转语句的使用 用于switch条件语句、for循环语句、while循环语句、do while循环语句中...

  • C语言学习 - continue跳转语句

    continue跳转语句的使用 用于for循环语句、while循环语句、do while循环语句中,跳过本次循环中...

网友评论

  • c3646d6b81c1:个人观点8的新特新循环不能改变外部对象句柄的引用。有时候不方便。且stream并行会带来线程并发的隐患。
  • mrzhqiang:仅提升可读性,代码编译后的字节码,依然是传统循环遍历方案。另外,安卓中,方法不宜过多😂😂😂

本文标题:你还在Java8中使用循环语句吗?

本文链接:https://www.haomeiwen.com/subject/udmugftx.html