forEachRemaining()是java1.8新增的Iterator接口中的默认方法
对于这个方法,官方文档是这么描述的:
Performs the given action for each remaining element until all elements have been processed or the action throws an exception. Actions are performed in the order of iteration, if that order is specified. Exceptions thrown by the action are relayed to the caller.
简单来说,就是对集合中剩余的元素进行操作,直到元素完毕或者抛出异常。这里重要的是剩余元素,怎么理解呢,下面就来用代码解释一下:

import java.util.*;
public class Test{
public static void main(String[] args){
//创建一个元素类型为Integer的集合
Collection<Integer> collection = new HashSet<>();
for (int i=0;i<10 ;i++ ){
//向集合中添加元素
collection.add(i);
}
//获取该集合的迭代器
Iterator<Integer> iterator= collection.iterator();
//调用forEachRemaining()方法遍历集合元素
iterator.forEachRemaining(ele -> System.out.println(ele));
}
}
输出为:
0
1
2
3
4
5
6
7
8
9

这是预料之中的结果。

那继续看下面代码:

import java.util.*;
public class Test
{
public static void main(String[] args)
{
//创建一个元素类型为Integer的集合
Collection<Integer> collection = new HashSet<>();
for (int i=0;i<10 ;i++ )
{
//向集合中添加元素
collection.add(i);
}
//获取该集合的迭代器
Iterator<Integer> iterator= collection.iterator();
//调用迭代器的经过集合实现的抽象方法遍历集合元素
while(iterator.hasNext())
{
System.out.println(iterator.next());
}
System.out.println("--------------");
//调用forEachRemaining()方法遍历集合元素
iterator.forEachRemaining(ele -> System.out.println(ele)); }
} 这时输出为:
0
1
2
3
4
5
6
7
8
9
--------------

明明调用了迭代器两个遍历方法,怎么会只遍历一次呢?
问题就出在剩余里,当第一次调用迭代器的经过集合实现的抽象方法遍历集合元素时,迭代器就已经将元素遍历完毕,也就是说迭代器中已经没有剩余元素了,因此这时调用forEachRemaining()方法,就什么也不输出了,为了验证,再来看下面代码:

        //获取该集合的迭代器
Iterator<Integer> iterator= collection.iterator();
//调用forEachRemaining()方法遍历集合元素
int i=0;
while(iterator.hasNext())
{
System.out.println(iterator.next());
i++;
if (i==5)
{
break;
}
}
System.out.println("--------------");
//调用forEachRemaining()方法遍历集合元素
iterator.forEachRemaining(ele -> System.out.println(ele)); }
}
这时输出:
0
1
2
3
4
--------------
5
6
7
8
9

可以看到,当我们第一次用迭代器遍历时,只让它遍历五次就跳出循环,那么就还剩下五个元素,再调用forEachRemaining()方法,就可以看到输出后五个元素了

测试代码:

        List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
Iterator<String> iterator = list.iterator();
System.out.println("第一次遍历");
iterator.forEachRemaining(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
System.out.println("第二次遍历");
while(iterator.hasNext()){
String item = iterator.next();
System.out.println(item);
}
System.out.println("第三次遍历");
iterator.forEachRemaining(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
System.out.println("第四次遍历");
Iterator<String> iterator2 = list.iterator();
while(iterator2.hasNext()){
String item = iterator2.next();
System.out.println(item);
}

输出结果:

第一次遍历
aaa
bbb
第二次遍历
第三次遍历
第四次遍历
aaa
bbb

参考文章:https://blog.csdn.net/qq_43717113/java/article/details/105062570

forEachRemaining()方法的用法的更多相关文章

  1. SIP中OPTIONS方法的用法及示例

    SIP中OPTIONS方法的用法及示例 用OPTIONS方法实现Keep Alive SIP keep-alive方法

  2. C# Path.Combine 方法的用法

    C#   Path.Combine 方法的用法 *.注意: string filePath3= Path.Combine(string path1,string path2): 情况一: path2中 ...

  3. ASP.NET中的ExecuteNonQuery()方法的用法

    下面我将详细讲解在机房收费系统D层中如何对数据库的增加.删除.修改,最后再来总结一下 ExecuteNonQuery(),ExecuteScalar(),ExecuteReader的用法: 一.增.删 ...

  4. Java用代码演示String类中的以下方法的用法

    用代码演示String类中的以下方法的用法 (1)boolean isEmpty(): 判断字符串是不是空串,如果是空的就返回true (2)char charAt(int index): 返回索引上 ...

  5. jQuery通用的全局遍历方法$.each()用法实例

    1.jQuery通用的全局遍历方法$.each()用法 2. test.json文件代码: 3. html代码 4.jQuery代码 <script src="jquery-1.3.1 ...

  6. Python中sorted()方法的用法

    Python中sorted()方法的用法 2012-12-24 22:01:14|  分类: Python |字号 订阅 1.先说一下iterable,中文意思是迭代器. Python的帮助文档中对i ...

  7. 【jQuery】praseFloat()方法的用法及注意事项

    [jQuery]praseFloat()方法的用法及注意事项 praseFloat():  用于解析一个字符串,并返回一个浮点数 语法:                praseFloat(strin ...

  8. Bootstrap 提示工具(Tooltip)插件方法的用法

    方法 下面是一些提示工具(Tooltip)插件中有用的方法: 方法 描述 实例 Options: .tooltip(options) 向元素集合附加提示工具句柄. $().tooltip(option ...

  9. pandas-15 df['one_col'].apply()方法的用法

    pandas-15 df['one_col'].apply()方法的用法 apply有点像map的用法,可以传入一个函数. 如:df['A'].apply(str.upper) import nump ...

随机推荐

  1. 【RAC】打完补丁后,发现只有一台rac可以启动,另一台无法启动

    安装11Gr2单机asm后,打完11.2.0.3.7的psu后,发现启动不起来数据库,alert日志内容如下: Errors in file /u01/app/oracle/diag/rdbms/bd ...

  2. 【Oracle】translate函数用法解析

    转自:https://blog.csdn.net/shwanglp/article/details/52814173 基本语法: translate(string,from_str,to_str); ...

  3. SQL Server management studio使用sa连接时报错与伺服器的连接已成功,但在登入程序是发生错误

    使用Sql Server management studio的sa用户连接数据库时,报如下错误 解决方法: 1.使用windows验证登录 2.右键点击连接,点击属性,点击安全性,选择混合验证 3.重 ...

  4. linux DRM GPU scheduler 笔记

    内核文档:   Overview   The GPU scheduler provides entities which allow userspace to push jobs into softw ...

  5. logicaldisk本地磁盘管理

    在网上搜了很多,但是基本都是一样的,差不多都是互相转载摘抄,就那么几个寥寥无几的例子,所以我冒了很大的风险,自己经过多次的测试,对这个命令有了一些新的认识!拿出来分享一下! LOGICALDISK   ...

  6. JavaScript的数据类型和数据类型的检测

    数据类型 JavaScript的基础数据类型有,NaN    string   undefined    Null      Boolen    Symbol   Bigint   这些都是基础数据类 ...

  7. JavaScript 实现排序算法

    参考文章: 十大经典排序算法动画,看我就够了! 1. 冒泡排序 思路 比较所有相邻元素,如果第一个比第二个大,则交换它们 一轮下来,可以保证最后一个数是最大的 执行n-1轮,就可以完成排序 代码 Ar ...

  8. memory ordering 内存排序

    Memory ordering - Wikipedia https://en.wikipedia.org/wiki/Memory_ordering https://zh.wikipedia.org/w ...

  9. 最简单直接地理解Java软件设计原则之单一职责原则

    理论性知识 定义 单一职责原则, Single responsibility principle (SRP): 一个类,接口,方法只负责一项职责: 不要存在多余一个导致类变更的原因: 优点 降低类的复 ...

  10. vue项目中如何引用tinymce

    最近公司在做一个CMS系统的项目,其中富文本编辑框用的很多,目前流行的也很多,包括wangEditor.TinyMCE.百度ueditor.kindeditor.CKEditor等.经过自己的一番翻箱 ...