不久前,我们将一些Eclipse插件项目升级到Java8。此后再也没有回头。 除其他事项外,使用lambda和streams API ,过滤,映射和查找集合中的元素变得更加容易和简洁。 我想到目前为止,对于大多数人来说,什么都没有。

但是许多现有的API在参数和/或返回数组中使用数组。 例如,请考虑以下虚构但通用的方法签名:

String[] filterStrings( String... input );

随之而来的是从数组中获取流的额外工作,以便能够优雅地过滤,映射,缩小等元素。 然后取回一个可以传递给老式API的数组。

向前…

要从数组中获取流,有很多选择。 例如,这行代码

Stream stream = Stream.of( "a", "b", "c" );

产生具有指定元素的流。 同样可以通过以下方式实现:

Stream stream = Arrays.stream( "a", "b", "c" );

实际上, Stream.of()使用Arrays.stream()完成任务。 通过列表绕行也会产生流:

Stream stream = Arrays.asList( "a", "b", "c" ).stream();

… 然后回来

一旦有了流,就可以使用所有流功能,例如,从字符串数组中过滤空字符串:

Stream.of( "a", "", "b", "", "c", "" ).filter( string -> !string.isEmpty() );

但是如何返回结果数组呢?

有用于集合和列表的收集器,但不包括用于简单数组的收集器。 此代码段

List<String> list= Stream.of( ... ).filter( ... ).collect( Collectors.toList() );
String[] array = list.toArray( new String[ list.size() ] );

使用toList()获得过滤后的输入的列表,然后在第二步中将该列表转换为数组。

我几乎要实现一个自定义数组收集器,以消除多余的步骤。 直到我发现有一个终端操作可以像这样简单地将流的结果捕获到数组中:

String[] array = Stream.of( ... ).toArray( size -> new String[ size ] );

toArray()需要generator ,它是对能够创建所请求大小的数组的方法的引用。 在这里创建一个String类型的数组。

但是,等等,还有一种更简单的方法。 如上所述,生成器是可以创建所需大小的数组的函数。 Java 8的开发者非常善于引入一些语法糖来直接引用数组构造函数。

通过在构造函数引用中添加一个左,右方括号,可以表示一个数组构造器引用 ,例如Type[]::new. 。 因此,上面的代码行可以这样重写:

String[] array = Stream.of( ... ).toArray( String[]::new );

编译器将String[]::new表达式扩展为size -> new String[ size ] 。 因此, 生成的字节码与前一种方法相同 ,但是我发现后者更为简洁。

而且,它消除了错误的生成的数组大小,这是不可能的,但仍然是可能的错误。 考虑一下:

String[] array = Stream.of( "a", "b", "c" ).toArray( size -> new String[ 1 ] );

创建的数组显然太小。 它的实际大小(一个)将永远无法容纳这三个结果元素。 因此将以IllegalStateException结尾。 使用数组构造函数引用时,编译器将确保创建适当大小的数组。

当然,还有一个通用的toArray()方法可返回一个Objects数组,如果结果数组的实际类型无关紧要,则可以使用该方法。

从数组到流再返回的结论

像我亲爱的同事Ralf一样 ,许多程序员更喜欢API接口中的集合而不是数组。 但是仍然有许多“老式” API要求您处理数组。 而且与API一样,这些不会很快消失。

但是,无论您喜欢哪种方式,或者无论哪种方式都必须使用现有代码,我都发现Java 8在两个世界之间提供了一个不错的桥梁,这是一个好消息。

如果您有任何疑问,建议或想分享您在该领域的经验,请发表评论。

翻译自: https://www.javacodegeeks.com/2015/11/from-arrays-to-streams-and-back-with-java-8.html

从数组到流再到Java 8相关推荐

  1. java8 从数组获取流_从数组到流再到Java 8

    java8 从数组获取流 不久前,我们将一些Eclipse插件项目升级到Java8.此后再也没有回头. 除其他事项外,使用lambda和streams API ,过滤,映射和查找集合中的元素变得更加容 ...

  2. java byte char io流_吃透Java IO:字节流、字符流、缓冲流

    前言有人曾问fastjson的作者(阿里技术专家高铁):"你开发fastjson,没得到什么好处,反而挨了骂背了锅,这种事情你为什么要做呢?" 高铁答道:"因为热爱本身, ...

  3. java 字符流read函数,JAVA中文件的读写 I/O 输入输出流

    主要内容 1.编码问题 2.File类的使用 3.RandomAccessFile的使用 4.I/O 输入输出流 编码问题: 1 importjava.io.UnsupportedEncodingEx ...

  4. 5.2 IO流(File类,Propertis配置文件,其他类(打印流,序列流,操作对象的流(序列化接口),随机访问文件的流,管道流,操作基本数据的流,操作数组的流,操作字符串的流),编码表)

    1.File类 IO流的流对象只能操作设备上的数据.File类:1.用来将文件或者文件夹(也称目录)封装成对象. 2.方便对文件和文件夹的属性信息进行操作.(操作文件夹,文件的属性(创建时间,修改时间 ...

  5. js解析java对象数组_js接收并转化Java中的数组对象的方法

    在做项目时,要向ocx控件下发命令,就要在js中得到java中的对象,然后拼成一种格式,下发下去...当对象是一个时比较简单,但如果对象是一个数组时,就略显麻烦了. 开始我以为有简单的方式,可以直接进 ...

  6. jni java返回数组_Android开发实践:Java层与Jni层的数组传递

    Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...

  7. c++随机打乱数组_第四天 Java 数组与排序

    一. 数组 数组(Array),是多个相同类型数据按一定顺序排列 的集合,并使用一个名字命名,并通过编号的方式 对这些数据进行统一管理. 数组的常见概念 数组名 下标(或索引) 元素 数组的长度 数组 ...

  8. java中的数组增删查改操作,java数组实现增删改查

    java 实现动态数组,Java工具类Arrays中不得不知的常用方法,数组实现队列java,java数组实现增删改查 java 增删改查代码 import java.sql.Connection; ...

  9. java-IO流-搜索含java字符的文件问题

    问题 在指定的文件件下,搜索含有'java'的文件名称并打印出来 基本思路 生成一个file实例 判断是文件还是目录 是文件判断是否含有java,有则打印 是目录则进入filterDir(File f ...

最新文章

  1. 实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序
  2. c/c++基础 输入函数/流
  3. 【NLP】国内实力雄厚的自然语言处理(NLP)研究组
  4. boost::safe_numerics::safe_signed_range相关的测试程序
  5. 动态配置流处理-BetterCloud如何使用Flink构建报警系统
  6. SAP C4C里前台Opportunity搜索的响应明细
  7. python基础知识 - Day4
  8. .net2.0 C# Json反序列化
  9. SpringFramework之javax.servlet.http.HttpSession
  10. 初识设计模式(单例模式)
  11. 程序员分析了 50 万条拼多多商品数据,告诉你到底是消费升级还是降级!
  12. 数据压缩实验5-JEPG解码
  13. 什么样男人必出轨 震惊!出轨男子名字中居然都有这字
  14. 预测:原理与实践(第二版)2021/05/01 第一次更新
  15. java基础学习:java中的反射
  16. avue设置表格显示图片
  17. chaigpt对接Siri
  18. oracle获取当前时间顺延指定工作日的日期
  19. 如何压缩PDF文件?这3个PDF在线压缩工具免费又好用!
  20. 通过游戏编程学Python(番外篇)— 单词小测验

热门文章

  1. A configuration error occurred during startup.Please verify the preference field with the prompt: To
  2. mybatisplus 强制制空 空覆盖原来的字符串
  3. aws使用技巧_AWS:避免那些“神圣的法案”时刻的一些技巧
  4. 使用Speedment 3.0.17及更高版本简化了事务
  5. wcg总决赛_关于总决赛
  6. java终结器_Java的终结器仍然存在
  7. drools6.5_Drools 6.5.0.Final可用
  8. java restful_Java EE中的RESTful计时器
  9. jvm崩溃的原因_JVM崩溃时:如何调查最严重错误的根本原因
  10. apache mesos_Apache Mesos + Marathon和Java EE