网页制作教程网站,网页设计模板html代码五四主题,抓取网站访问量,丘受网站谁做的网球吧java8 从数组获取流不久前#xff0c;我们将一些Eclipse插件项目升级到Java8。此后再也没有回头。 除其他事项外#xff0c;使用lambda和streams API #xff0c;过滤#xff0c;映射和查找集合中的元素变得更加容易和简洁。 我想到目前为止#xff0c;对于大多数人来说我们将一些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() ); 但是如何返回结果数组呢 有用于集合和列表的收集器但不包括用于简单数组的收集器。 此代码段 ListString 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()方法可返回一个对象数组如果结果数组的实际类型无关紧要则可以使用该方法。 从数组到流再返回的结论 像我亲爱的同事Ralf一样 许多程序员在API接口中更喜欢集合而不是数组。 但是仍然有许多“老式” API要求您处理数组。 而且与API一样这些不会很快消失。 但是无论您喜欢哪种方式或者无论哪种方式都必须使用现有代码我都发现Java 8在两个世界之间提供了一个不错的桥梁这是一个好消息。 如果您有任何疑问建议或想分享您在该领域的经验请发表评论。 翻译自: https://www.javacodegeeks.com/2015/11/from-arrays-to-streams-and-back-with-java-8.htmljava8 从数组获取流