Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >请停止编写这么多的for循环!

请停止编写这么多的for循环!

作者头像
武培轩
发布于 2019-12-10 08:34:38
发布于 2019-12-10 08:34:38
82300
代码可运行
举报
文章被收录于专栏:武培轩的专栏武培轩的专栏
运行总次数:0
代码可运行

在这篇文章中,我想和你一起回到基础知识,并讨论 Java 中的 for 循环。老实说,我正在为自己写这篇博客文章,因为我也会这样做。从 Java 8 开始,我们不必在 Java 中编写太多 for 循环!我希望这篇文章将使你的代码更易于阅读和编写。

你需要 for 循环做什么?

一般地说,for 循环执行两类任务:

  • 遍历集合
  • 运行算法

对于算法,for 循环可能是合适的。看一下此算法,检查数字是否为三的幂:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
double number = 81;
for(; number > 1; number /=3);
return number == 1;

在这里,for 循环是合适的。这是一个非常简单的示例,你可以想象,使用更困难的算法会变得更加棘手。

对于大多数开发人员而言,在他们的日常工作中,这种情况很少。大多数时候,我们使用 for 循环遍历集合。让我们看一下该代码的一些示例。

遍历 Java 中的集合

我们首先来定义一个 List 数组,并往里面插入一些元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<String> heroes = new ArrayList<>();
heroes.add("典韦");
heroes.add("云中君");
heroes.add("鲁班");
heroes.add("盘古");
heroes.add("大乔");
heroes.add("宫本武藏");
heroes.add("裴擒虎");
heroes.add("明世隐");

有很多方法可以对其进行迭代。让我们从相当古老的迭代器方法开始:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Iterator<String> heroesIterator = heroes.iterator();
while (heroesIterator.hasNext()) {
    System.out.println(heroesIterator.next());
}

这种代码使 Java 在冗长性上享有应有的声誉。

这次尝试使用经典的索引 for 循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (int i = 0; i < heroes.size(); i++) {
    System.out.println(heroes.get(i));
}

嗯,这有点简单,但是在 Java 5 之后,我们可以这样处理循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (String hero : heroes) {
    System.out.println(hero);
}

这是大多数开发人员陷入困境的地方。这种结构非常熟悉并且易于遵循,以至于我们大多数人都不会去考虑更好的东西。但是在 Java 8 以后我们可以使用 forEach 函数来进行简化。

借助 Java 8,我们可以使用 forEach 函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
heroes.forEach(hero -> System.out.println(hero));

我们可以进一步简化它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
heroes.forEach(System.out::println);

在我们只是迭代数组的元素时,这样会使代码很简洁。

下一步呢?使用 Java Streams

一旦停止在 Java 中编写如此多的 for 循环,forEach 就成为了你的第二选择,那么你应该看看 Java 中的 Streams。

例如,使用类似的语法,你可以轻松选择所有以 “鲁” 开头的英雄:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
heroes.stream().filter(hero -> hero.startsWith("鲁"))
        .forEach(System.out::println);

运行结果会显示小短腿“鲁班”。

总结

停止编写太多 for 循环,完成后,Java 8 Streams 将自然而然地出现,你的代码将更易于阅读和编写。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
和 lvgo 一起学设计模式(十八)行为型之迭代器模式
这段代码很简单,我们在日常开发中可能也是经常使用到。有的人可能会说了,啊不对,我用的都是
星尘的一个朋友
2020/12/07
4290
和 lvgo 一起学设计模式(十八)行为型之迭代器模式
ArrayList哪种循环效率更好你真的清楚吗
既然有4种遍历,那我们看看哪种遍历效率下面我们通过一个实验来看下这四种循环的耗时吧: 测试代码
java金融
2020/06/03
7250
ArrayList哪种循环效率更好你真的清楚吗
三种骚操作绕过迭代器遍历时的数据修改异常
既然是绕过迭代器遍历时的数据修改异常,那么有必要先看一下是什么样的异常。如果在集合的迭代器遍历时尝试更新集合中的数据,比如像下面这样,我想输出 Hello,World,Java,迭代时却发现多了一个 C++ 元素,如果直接删除掉的话。
未读代码
2021/03/03
6080
三种骚操作绕过迭代器遍历时的数据修改异常
你真的会写for循环吗?这 11 个 for 循环优化你得会...
日常开发中,经常会遇到一些循环耗时计算的操作,一般也都会采用 for 循环来处理,for 作为编程入门基础,主要是处理重复的计算操作,虽然简单好用,但在写法上也有很多的考究,如果处理不好,可能成为拖垮程序的罪魁祸首,下面总结 10 多条 for 循环的常见优化方式,让代码优雅起来。
一行Java
2023/11/01
1.3K0
你真的会写for循环吗?这 11 个 for 循环优化你得会...
Java集合框架-Collection02- LinkedHashSet
目录   堆栈 Stack: 1. Set(用到了下面的HashSet类)   1.1 特点:无序、对象不能重复 问题:元素是被覆盖还是被过滤了?  1.2 遍历   1.3 常用实现类  LinkedHashSet: ​​​​​​​ ---- 堆栈 Stack: 表示一个先进后出的数据结构(用弹夹做一个例子,最先进的子弹最后被打出去)   压:push   弹:pop package com.zking.Collection02.util; /** * 目标:使用LinkedList实现堆栈
天蝎座的程序媛
2022/11/18
2030
为什么说写 Java 的人 for循环得用好?
注意,是四种写法,并不是说底层的四种实现方式,这四种写法各有千秋,但是也是最常用的几种
代码宇宙
2023/02/16
6790
List 集合安全操作指南:避免 ConcurrentModificationException 与提升性能
Hey小伙伴们,今天要给大家安利一篇操作实践的文章,相信大家通过仔细阅读,一定会有所收货!
不惑
2024/11/20
1470
List 集合安全操作指南:避免 ConcurrentModificationException 与提升性能
Java8编程思想之Lambda表达式&Stream流式编程&方法引用(method references)
利用流,无需迭代集合中的元素,就可以提取和操作它们。这些管道通常被组合在一起,在流上形成一条操作管道。
JavaEdge
2021/02/22
2.1K0
java---集合(数据结构)(重点)
以前存储一组相同类型的数据使用数组,固定大小,具有连续性的存储空间。比如,5个长度的数组再存入数据时,如果现在已经存满,存入第六个元素,这时数组空间不够,扩容。Arrays.copyOf() , 很不方便,如果扩容频率太高,也影响你程序运行效率。集合来解决数组固定,如果扩容又影响效率的问题
用户10787181
2023/10/17
2450
java---集合(数据结构)(重点)
Java遍历List集合的4种方式【JAVA】
Java遍历List集合的4种方式 public class Test { public static void main(String[] args) { // 循环遍历List的4中方法 List<String> strList = new ArrayList<>(); strList.add("aaa"); strList.add("bbb"); strList.add("ccc"); // 1
来杯Sherry
2023/05/25
5720
增强for循环
需求:创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
秋落雨微凉
2022/10/25
1.3K0
增强for循环
16(03)总结增强for循环,静态导入,可变参数
3:增强for循环(掌握) (1)是for循环的一种 (2)格式: for(元素的数据类型 变量名 : 数组或者Collection集合的对象) { 使用该变量即可,该变量其实就是数组或者集合中的元素。 } (3)好处: 简化了数组和集合的遍历 (4)弊端 增强for循环的目标不能为null。建议在使用前,先判断是否为null。 package cn.itcast_01; import java.util.ArrayList; import java.util.List; /* * JD
Java帮帮
2018/03/15
1.3K0
Java中普通for循环和增强for循环的一些区别
对于实现了RandomAccess接口的集合类,推荐使用普通for,这种方式faster than Iterator.next
XING辋
2019/03/26
1.6K0
跟我学 Java 8 新特性之 Stream 流(六)收集
我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些元素,并以集合的方式返回,我们把这种反向操作称为收集。
Java技术栈
2018/08/17
7510
Lambda表达式和流(Streams)简化代码:提升Java开发效率
在现代Java开发中,Lambda表达式和Streams API已经成为不可或缺的工具,它们可以大幅度简化集合操作和数据处理代码,提升代码的可读性和可维护性。本篇博客将详细介绍如何使用Lambda表达式简化集合处理,以及如何利用Streams API进行流式数据处理,让你在编写Java代码时更加高效。即使你是一个初学者,本文也会通过简单的代码示例帮助你快速上手。
默 语
2025/01/20
800
HashMap 的 7 种遍历方式与性能分析!(强烈推荐)
随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题。
磊哥
2020/05/04
12.4K0
面试官上来就让手撕HashMap的7种遍历方式,当场愣住,最后只写出了3种
今天有个小伙伴私信诉苦,说面试官上来就让他手撕HashMap的7种遍历方式,最终只写出3种常用的,怀疑面试官是在故意刁难。这个问题大家怎么看?
JavaBuild
2024/05/27
1140
面试官上来就让手撕HashMap的7种遍历方式,当场愣住,最后只写出了3种
Java8新特性Stream还有这种操作?
那么,使用Stream API怎么个简洁法呢?我们先来看一下Stream API给我们提供了哪些方法,然后实际操作一下,看看使用上有是不是真的很爽。
行百里er
2020/12/02
4340
Java8新特性Stream还有这种操作?
JAVA8 中的stream 是什么?
元素是特定类型的对象,形成一个队列。Java中的Stream并不会存储元素,而是按需计算。 数据源 流的来源。可以是集合,数组,I/O channel, 产生器generator 等。 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。 和以前的Collection操作不同, Stream操作还有两个基础的特征:
Java宝典
2021/01/14
1.4K0
JAVA中简单的for循环竟有这么多坑,你踩过吗
实际的业务项目开发中,大家应该对从给定的list中剔除不满足条件的元素这个操作不陌生吧?
是Vzn呀
2022/07/14
6070
JAVA中简单的for循环竟有这么多坑,你踩过吗
推荐阅读
相关推荐
和 lvgo 一起学设计模式(十八)行为型之迭代器模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验