从数组到流再到Java 8

不久前,我们将一些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

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

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

相关文章

iphone型号表_机器人造iPhone,苹果奋斗八年,还是败给了富士康工人

8 年前&#xff0c;当蒂姆 库克在富士康观看机器人进行 iPad 实验生产视频时&#xff0c;似乎看到了新时代的希望。郭台铭曾表示&#xff0c;预计在 2014 年可以在富士康工厂中部署 100 万台机器人&#xff0c;进而实现高度自动化的「无人工厂」。机器之心报道&#xff0c;参与…

笔记本如何选择修复计算机,如何处理旧的笔记本电脑?这些操作必不可少!

原标题&#xff1a;如何处理旧的笔记本电脑&#xff1f;这些操作必不可少&#xff01;如何处理旧的笔记本电脑&#xff1f;不要把它丢掉。那台旧笔记本电脑至少应适当回收。就算是打算仅回收旧笔记本电脑&#xff0c;也请确保有效擦除所有数据。备份如今&#xff0c;云服务如此…

Android开源工具项目集合

最近因为要去外派了&#xff0c;工欲善其事&#xff0c;必先利其器&#xff01;所以又回顾了一下自己github上所收藏的项目&#xff0c;也算是温故而知新吧。 最流行的Android组件大全 http://www.open-open.com/lib/view/open1409108030307.html android开源项目分类汇总 http…

算法工程师和python_算法工程师只掌握Python行吗?如果在java和cpp中选一门语言学习哪个更有用?...

算法工程师只掌握python有可能不够用的。算法本身是脱离编程语言的。以目前的市场环境格局&#xff0c;大量的算法工程师都不可能全部时间精力投入到算法研究上来&#xff0c;是要实际参与到也许项目里面去的。不论是ai相关的模式识别方面的算法还是传统的一些计算机确定性算法…

删除 终端服务器,终端服务器命令更改 - Windows Server | Microsoft Docs

终端服务器命令&#xff1a;更改09/14/2020本文内容本文提供有关终端服务器命令的一些信息 change 。适用于&#xff1a; Windows Server 2012R2原始 KB 编号&#xff1a; 186504摘要该命令 change 将替换 Citrix Winframe 中的 CHGLOGON、CHGUSER 和 CHGPORT。更改实用程序…

Android-Universal-Image-Loader学习笔记(3)--内存缓存

前面的两篇博客写了文件缓存。如今说说Android-Universal-Image-Loader的内存缓存。该内存缓存涉及到的类如图所看到的 这些类的继承关系例如以下图所看到的&#xff1a; 如同文件缓存一样&#xff0c;内存缓存涉及的接口也有两个&#xff1a;MemoryCacheAware 和MemoryCache&a…

java nosql_Java EE的NoSQL的未来

java nosql从现在开始一段时间以来&#xff0c;我一直在关注NoSQL的近期发展势头&#xff0c;似乎这个流行语也引起了企业Java界的某种关注。 即EclipseLink 2.4开始支持MongoDB和Oracle NoSQL 。 将EclipseLink作为JPA参考实现&#xff0c;您可能想知道这对Java EE 7意味着什么…

css设置字体颜色怎么设,css里面怎么设置字体颜色?

在html中我们经常要用到css样式来美化html标签的一些不足之处&#xff0c;今天我们就来说说如何用css的基本样式来改变文本的颜色&#xff0c;文章通俗易懂&#xff0c;希望大家看完后能练习练习加深印象。一、首先我们先给大家看个html字体的基础代码&#xff1a;HTML中文网字…

visio科学图形包_科学网—科研必备:几款好用的流程图工具,助力你的论文/科研绘图...

写SCI论文常常会遇到一个问题——如何才能让读者通俗易懂地理解自己的研究&#xff1f;如果不能让读者了解研究过程&#xff0c;读者会对研究结果是否合理、如何应用存在疑问&#xff1b;尤其是期刊编辑和审稿人如果不能通过咱们的叙述&#xff0c;清楚地了解研究内容&#xff…

网络通信基础(草稿)

应用层&#xff1a;httpd/ssh/ 等软件 应用层功能&#xff1a;规定应用程序的数据格式。传输层&#xff1a;tcp/udp --> port&#xff0c;唯一标识一个主机上的某个进程 端口范围0-65535&#xff0c;0-1023为系统占用端口 传输层的功能&#xff1a;建立端口到端口的通信…

JSF范围教程– JSF / CDI会话范围

会话作用域跨越多个HTTP请求-响应周期&#xff08;理论上是无限的&#xff09;。 当您需要每个HTTP请求-响应周期进行一次交互时&#xff0c;请求作用域在任何Web应用程序中都非常有用。 但是&#xff0c;当您需要对属于用户会话的任何HTTP请求-响应周期可见的对象时&#xf…

css 关闭按钮实现,CSS做的关闭按钮动效

CSS语言&#xff1a;CSSSCSS确定* {padding: 0;margin: 0;box-sizing: border-box;}body {background: #141926;font-family: Helvetica, Arial, sans-serif;}.outer {position: relative;margin: auto;width: 70px;margin-top: 200px;cursor: pointer;}.inner {width: inherit…

数字通信原理_光耦继电器在实际应用中的作用以及工作原理!

光耦继电器---先进光半导体由于光耦继电器输入输出间互相隔离&#xff0c;电信号传输具有单向性等特点&#xff0c;因而具有良好的电绝缘能力和抗干扰能力。又由于光耦的输入端属于电流型工作的低阻元件&#xff0c;因而具有很强的共模抑制能力。所以&#xff0c;它在长线传输信…

网页布局

网页布局 网页布局方面是凌乱的&#xff0c;做出来的成果会漂浮&#xff0c;超出理想的效果&#xff0c;posted on 2017-06-25 16:02 大师放放 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/shujie/p/7077027.html

css的fill属性,css column-fill属性怎么用

css column-gap属性定义及用法在css中&#xff0c;column-gap属性通常和columns、column-count等分列属性一起使用&#xff0c;用来设置元素内容分列(多列布局)后列与列之间的距离css column-gap属性语法格式css语法&#xff1a;column-gap: length / normal;(例&#xff1a;co…

python的matplotlib风格_matplotlib 的几种风格 练习

〇、准备数据import numpy as npx np.linspace(0, 5, 10)y x ** 2一、matlab风格的API1.单图from pylab import *figure()plot(x, y, r)xlabel(x)ylabel(y)title(title)show()2.多子图subplot(1,2,1)plot(x, y, r--)subplot(1,2,2)plot(y, x, g*-);二、matplotlib面向对象风格…

[Leetcode] Anagrams 颠倒字母构成词

Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. 题意&#xff1a;anagrams的意思是回文构词法。回文构词法有一个特点&#xff1a;单词里的字母的种类和数目没有改变&#xff0c;只是改变了字母的排列顺…

gradle spring_用于Spring应用程序的Gradle原型

gradle spring我发布了Gradle原型&#xff0c;可用于基于Springframework创建Java / Groovy应用程序。 当然&#xff0c;它不是一个真正的原型&#xff0c;因为这样的创作是不可能的 。不过&#xff0c;你可以创建&#xff0c;编辑和部署应用服务器很少的步骤。 对于可部署的软…

css点击事件不做反应,纯css无js实现点击事件

已经阅读主要根据的技术点&#xff1a;标签为 input 元素定义标注(标记)。label 元素不会向用户呈现任何特殊效果。不过&#xff0c;它为鼠标用户改进了可用性。如果您在 label 元素内点击文本&#xff0c;就会触发此控件。就是说&#xff0c;当用户选择该标签时&#xff0c;浏…

Spring Integration Framework简介

我们非常了解Spring框架和JMS 。 在本文中&#xff0c;我们将介绍称为Spring Integration的企业集成框架 。 Spring Integration是一个开源企业集成框架&#xff0c;可增强Spring单独完成的功能。 Spring Integration构建在Spring的IoC之上&#xff0c;它抽象了消息源和目标&am…