[转载] Java8 Stream流遍历 如何使用索引

参考链接: Java 8中迭代带有索引的流Stream

1. 问题来源 

Java8的Stream流为我们的遍历集合带来了方便,基本可以取代for循环了。但是有一些情况需要知道当前遍历的索引,使用for循环当然可以轻易获得,但使用stream就很难了。 比如下面这个情况: 有一个集合list,里面存储的是引用类型。 使用for循环可以轻易的操作索引i 

for (int i = 0; i < list.size(); i++){

    System.out.println(list.get(i));

    System.out.println(i);

}

 

使用Stream流遍历list如下,其中handle是一个方法,想在handle方法里面拿到当前索引是很困难的。 

list.stream().map(t -> handle(t)).collect(Collectors.toList());

 

2. 解决办法 

使用IntStream流来构造一个Int类型的流出来,然后遍历这个Int的流,list中的对象可以通过get方法来取。具体解决代码如下: 

IntStream.range(0, lists.size())

         .mapToObj(i -> handle(lists.get(i), i))

         .collect(Collectors.toList());

 

可以看到代码里的这一句:handle(lists.get(i), i),这样就成功的把索引带入到了handle方法中。 

需要注意的是:在流中必须使用mapToObj,而不能使用map映射 

3. map映射和mapToObj的区别 

首先Stream流下面的类包含了IntStream, LongStream, DoubleStream等 

那么究竟下面两者有什么区别呢? 

Stream<Integer> // 包装类型

IntStream    //基本类型

 

所以对于mapToObj和mapToInt也是同样的 mapToObj 方法主要是将Stream中的元素进行装箱操作, 转换成一个引用类型的值。 mapToInt 方法是将Stream中的 元素转换成基本类型int。 比如下面的例子 

Stream s = IntStream.of(4, 5, 6).mapToObj(e -> e); //mapToObj method is needed

IntStream is = Stream.of(4, 5, 6).mapToInt(e -> e); //mapToInt method is needed

 

可以看到Stream是包装类型,所以想要把IntStream基本类型流转化成包装类型,就需要使用mapToObj。 

上面两个mapToObj和mapToInt是进行类型的转化,那么map的作用呢? map不进行类型转化,如果原来流中是基本类型,map映射完应当还是基本类型,如果原来是包装类型,映射完应当还是包装类型。 比如下面这个例子: 

IntStream.of(1, 2, 3, 4, 5, 6, 7).map(elem -> elem * 10).forEach(System.out::println);

 

这也就解释了,为什么上面的第二节解决办法里面,用map不行,而需要mapToObj,因为那里做了一个基本类型到包装类型的转化 

3. 总结 

使用IntStream可以灵活的操作对象和获取索引。map不进行包装和基本类型的转化,mapToObj是基本转为包装,mapToInt是包装转为基本。 

END 

参考 

Java 8之基本类型优化 Java Stream difference between map and mapToObj How to get element index when using a stream to traverse a list?

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

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

相关文章

Jquery简单的右侧浮动菜单

今天有空稍微看了下Jquery动画函数animate这个方法&#xff0c;发现可以用这个方法来做下简单的右侧浮动菜单 因为经常做淘宝页面时候会碰到这样的效果 以前都是用人家的javascript组件代码 发现老是用人家也不好&#xff0c;所以今天有空用jqeury中的animate这个方法写了一个简…

[转载] Java8-Stream API 详解

参考链接&#xff1a; 如何在Java 8中从Stream获取ArrayList 摘要 Stream 作为 Java 8 的一大亮点&#xff0c;它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream&#xff0c;也不是 Amazon Kinesis 对大数据实时处理…

在Microsoft System Center中利用您的现有投资管理VMware--Veeam MP v6.5

在 Microsoft System Center 中利用您的现有投资管理 VMware VeeamManagement Pack (MP) v6.5 适用于物理、虚拟和备份基础架构的单一的虚拟管理平台 前段时间介绍了Veeam Management Pack (MP) v6.0产品&#xff0c;昨天发布了新版本VeeamManagement Pack (MP) v6.5&#xff0…

[转载] Java关键字(Java 8版本)

参考链接&#xff1a; 所有Java关键字列表 定义 被Java语言赋予了特殊含义&#xff0c;用作专门用途的字符串&#xff08;单词&#xff09;&#xff0c;这些关键字不能用于常量、变量、和任何标识符的名称。 Java关键字(Java 8版本) Java关键字(Java 8 以后版本) 注意事…

uiw 1.2.17 发布,基于 React 16 的组件库

发布&#xff0c; 高品质的UI工具包&#xff0c;React 16的组件库。 文档网站&#xff1a;uiw-react.github.io开源仓库&#xff1a;github.com/uiw-react/u… 更新内容&#xff1a; ? 修复没有代码检测文件匹配*.css。 5712887 ? 添加 .editorconfig 文件. d82dabf ⛑ 给测试…

[转载] Java中this和super关键字分别是什么意思

参考链接&#xff1a; Java中的Super关键字 this和super关键字 this是自身的一个对象&#xff0c;代表对象本身可以理解为指代当前的对象&#xff0c;它可以调用当前对象的属性、方法和构造方法&#xff0c;一般情况下可以省略&#xff0c;必须使用this的地方是区分出现名字重…

SpringMVC注解HelloWorld

今天整理一下SpringMVC注解 欢迎拍砖 RequestMapping RequestMapping是一个用来处理请求地址映射的注解&#xff0c;可用于类或方法上。用于类上&#xff0c;表示类中的所有响应请求的方法都是以该地址作为父路径。 RequestMapping注解有六个属性&#xff0c;下面我们把她分成三…

mysql问答汇集

问:A&#xff0c;B两台mysql实现主从复制,A提供写&#xff0c;B提供读,那既然B要同步A&#xff0c;当A更新数据的时候&#xff0c;B不也一样要更新吗&#xff1f;那B不还是没有实现负载减轻吗&#xff1f;还有能通过MYSQL proxy实现3台mysq均衡l吗&#xff1f;一台写&#xff0…

自制 移动端 纯原生 Slider滑动插件

在Google搜关键字“slider”或“swiper”能找到一大堆相关插件&#xff0c;自己造轮子是为了能更好的理解其中的原理。 给这个插件取名为“veSlider”是指“very easy slider”非常简单的一个滑动插件。 这只是个半成品&#xff0c;仅仅实现了手指滑动、自动轮播、跳转等基本功…

ISA Server 2006 部署步骤

ISA Server 2006 部署步骤 Posted by 尹揆 在这里先把ISA2006的安装步骤给大家贴出来,后面陆续会有一些配置及日常的应用,希望大家多多指教!呵呵.ISA功能的强大自然不用多说了,一句话只要能想到它就能做到!放入光盘出现在我们面前还是其人性化的界面点默认的下一步吧接受协议序…

ELK 分析 nginx access 日志

注意&#xff1a;修改配置后建议重新创建index 1、nginx 日志文件格式 123log_format elk "$http_clientip | $http_x_forwarded_for | $time_local | $request | $status | $body_bytes_sent | ""$request_body | $content_length | $http_referer | $http_use…

mysql将查询数据另存

1.查询mysql的存储执行目录&#xff08;secure-file-priv是指定文件夹作为导出文件存放的地方&#xff09;所以需要查询以下&#xff0c;不然会报1290错误 show variables like %secure%;2.查询并转存 SELECT * into outfile C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\zo…

重新捡起flask(三)

记一次bug调试。 本来以为模板这一章可以很快的过掉的&#xff0c;刚刚写完的2其实只剩下个flask-moment时间库了&#xff0c;之前早就做过&#xff0c;记得很简单&#xff0c;本来说只要敲一下代码就结束&#xff0c;没想到&#xff0c;踩坑里去了。 调试bug吗&#xff0c;我想…

远程服务器部署spring boot 项目(centos7为例)

1.打包项目&#xff08;可以是jar包&#xff0c;也可以是war包&#xff09;以jar包为例&#xff08;用eclipse打包&#xff09;&#xff1a;1.项目目录右击--debug as&#xff08;run as&#xff09;--maven build&#xff0c;然后输入package&#xff0c;点击debug&#xff0c…

SIN的服务器配置

统计了新加坡服务器中IBM XIV存储挂载的主机列表。 对于vmware虚拟机来说&#xff0c;是这么组成的&#xff1a; 存储分了多个lun&#xff0c;在os侧叫做data store&#xff0c;多个datastore挂给多个物理机&#xff0c;物理机(安装了esxi软件)称为ESXI主机&#xff0c;多个ESX…

sklearn的train_test_split

sklearn的train_test_split train_test_split函数用于将矩阵随机划分为训练子集和测试子集&#xff0c;并返回划分好的训练集测试集样本和训练集测试集标签。 格式&#xff1a; X_train,X_test, y_train, y_test cross_validation.train_test_split(train_data,train_target,…

textmate bundle for jquery

使用这个bundle的例子:键入ready然后按tab就会生成下面的代码:$(document).ready(function() { }); 其中第二行被选中,这时在里面编写jquery代码即可. 如果要查看某个function的官方文档的话可以在键入的function之后使用快捷键ctrlh 查看. 关于bundle的下载 这里是一个textmat…

sklearn机器学习实例

原创网址&#xff1a;https://blog.csdn.net/qq_27150893/article/details/80169736 sklearn是非常流行的机器学习库&#xff0c;实现了很多的机器学习模型。官网&#xff1a;http://scikit-learn.org/stable/ 里面有全面的实例和模型参数讲解&#xff0c;用到哪个模型就去官…

CSVDE批量导入域用户

CSVDE批量导入用户 你可以使用Csvde格式的文件在活动目录中创建用户帐号和其他类型的帐号。但你不能使用Csvde删除活动目录中的对象。 使用Csvde命令行工具创建用户帐号&#xff0c;采用下列步骤&#xff1a; 1. 创建Csvde输入文件。文件应包含下列信息。 属性行&#xff1a;这…

sklearn 实例

http://scikit-learn.org/stable/auto_examples/index.html sklearn例子大全 https://deeplearning4j.org/mnist-for-beginners deeplearning官网