使用JDK 8流在包装对象的集合和包装对象的集合之间转换

我发现使用基于Java的应用程序时, 装饰器和适配器有时会很有用。 这些“包装器”在各种情况下都能很好地工作,并且相当容易理解和实现,但是当需要包装对象的层次结构而不是单个对象时,事情可能会变得有些棘手。 在这篇博客文章中,我研究了Java 8流如何使在对象集合和包装这些对象的对象集合之间转换变得更加容易。

在此讨论中,我将应用两个简单的Java类,分别表示Movie类和“包装”该类的类MovieWrapper 。 我在有关Java集合的JDK 8增强功能的 帖子中使用了Movie类。 接下来显示Movie类和包装它的类。

电影.java

package dustin.examples.jdk8.streams;import java.util.Objects;/*** Basic characteristics of a motion picture.** @author Dustin*/
public class Movie
{/** Title of movie. */private final String title;/** Year of movie's release. */private final int yearReleased;/** Movie genre. */private final Genre genre;/** MPAA Rating. */private final MpaaRating mpaaRating;/** imdb.com Rating. */private final int imdbTopRating;public Movie(final String newTitle, final int newYearReleased,final Genre newGenre, final MpaaRating newMpaaRating,final int newImdbTopRating){this.title = newTitle;this.yearReleased = newYearReleased;this.genre = newGenre;this.mpaaRating = newMpaaRating;this.imdbTopRating = newImdbTopRating;}public String getTitle(){return this.title;}public int getYearReleased(){return this.yearReleased;}public Genre getGenre(){return this.genre;}public MpaaRating getMpaaRating(){return this.mpaaRating;}public int getImdbTopRating(){return this.imdbTopRating;}@Overridepublic boolean equals(Object other){if (!(other instanceof Movie)){return false;}final Movie otherMovie = (Movie) other;return   Objects.equals(this.title, otherMovie.title)&& Objects.equals(this.yearReleased, otherMovie.yearReleased)&& Objects.equals(this.genre, otherMovie.genre)&& Objects.equals(this.mpaaRating, otherMovie.mpaaRating)&& Objects.equals(this.imdbTopRating, otherMovie.imdbTopRating);}@Overridepublic int hashCode(){return Objects.hash(this.title, this.yearReleased, this.genre, this.mpaaRating, this.imdbTopRating);}@Overridepublic String toString(){return "Movie: " + this.title + " (" + this.yearReleased + "), " + this.genre + ", " + this.mpaaRating + ", "+ this.imdbTopRating;}
}

MovieWrapper.java

package dustin.examples.jdk8.streams;/*** Wraps a movie like a Decorator or Adapter might.* * @author Dustin*/
public class MovieWrapper
{private Movie wrappedMovie;public MovieWrapper(final Movie newMovie){this.wrappedMovie = newMovie;}public Movie getWrappedMovie(){return this.wrappedMovie;}public void setWrappedMovie(final Movie newMovie){this.wrappedMovie = newMovie;}public String getTitle(){return this.wrappedMovie.getTitle();}public int getYearReleased(){return this.wrappedMovie.getYearReleased();}public Genre getGenre(){return this.wrappedMovie.getGenre();}public MpaaRating getMpaaRating(){return this.wrappedMovie.getMpaaRating();}public int getImdbTopRating(){return this.wrappedMovie.getImdbTopRating();}@Overridepublic String toString(){return this.wrappedMovie.toString();}
}

通过上面定义的MovieMovieWrapper类,我现在看一下将其中一个的集合转换为另一个的集合。 在JDK 8之前,将Movie对象的集合转换为MovieWrapper对象的集合的典型方法是迭代Movie对象的源集合,并将每个对象添加到MovieWrapper对象的新集合中。 下一个代码清单对此进行了演示。

将包装对象的集合转换为包装对象的集合

// movies previously defined as Set<Movie>
final Set<MovieWrapper> wrappedMovies1 = new HashSet<>();
for (final Movie movie : movies)
{wrappedMovies1.add(new MovieWrapper(movie));
}

使用JDK 8流,现在可以如下面的代码清单所示实现上述操作。

将包装对象的集合转换为包装对象的集合– JDK 8

// movies previously defined as Set<Movie>
final Set<MovieWrapper> wrappedMovies2 =movies.stream().map(movie -> new MovieWrapper(movie)).collect(Collectors.toSet());

可以类似地比较转换另一个方向(从包装对象的集合到包装对象的集合),以演示JDK 8如何改变这一方向。 接下来的两个代码清单显示了旧方法和JDK 8方法。

将包装对象的集合转换为包装对象的集合

final Set<Movie> newMovies1 = new HashSet();
for (final MovieWrapper wrappedMovie : wrappedMovies1)
{newMovies1.add(wrappedMovie.getWrappedMovie());
}

将包装对象的集合转换为包装对象的集合– JDK 8

final Set<Movie> newMovies2 =wrappedMovies2.stream().map(MovieWrapper::getWrappedMovie).collect(Collectors.toSet());

就像我在JDK 8中的“流支持集合功能”一文中的一些示例一样,本文中的示例展示了JDK 8中提供的聚合操作的强大功能。这些聚合操作相对于传统迭代的优势包括代码中的简洁性,可以说是(也许最终)更大的可读性,以及内部迭代的优势(包括更容易的潜在流支持的并行化)。 Java 8将转换对象转换为另一种类型,显示了使用流和更复杂的Function在不太相关的对象的集合之间进行转换的一个很好的示例。

翻译自: https://www.javacodegeeks.com/2015/02/using-jdk-8-streams-convert-collections-wrapped-objects-collections-wrapper-objects.html

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

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

相关文章

mysql注入提取邮件_【sql注入教程】mysql注入直接getshell

Mysql注入直接getshell的条件相对来说比较苛刻点把1:要知道网站绝对路径&#xff0c;可以通过报错&#xff0c;phpinfo界面&#xff0c;404界面等一些方式知道2:gpc没有开启&#xff0c;开启了单引号被转义了&#xff0c;语句就不能正常执行了3:要有file权限&#xff0c;默认情…

使用WildFly 8.2.0.Final,Primefaces 5.1和MySQL 5的JDBC领域和基于表单的身份验证

我会不时查看我博客上最受欢迎的内容&#xff0c;并尽力满足您的最佳需求。 因此&#xff0c;阅读我的博客是其他读者推动内容的一种方式。 另一种方法是通过评论或电子邮件与我联系。 今天&#xff0c;我将使用Primefaces修改我的JDBC Realm示例并将其更新到最新的WildFly服务…

【转】代码里的命名规则:错误的和正确的对比

原文出处&#xff1a; goyello 译文出处&#xff1a; 外刊IT评论 编程初学者总是把大量的时间用在学习编程语言&#xff0c;语法&#xff0c;技巧和编程工具的使用上。他们认为&#xff0c;如果掌握了这些技术技巧&#xff0c;他们就能成为不错的程序员。然而&#xff0c;计算…

mysql怎么给表设置查询语句_MySQL查询语句简单操作示例

本文实例讲述了MySQL查询语句简单操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;查询创建数据库、数据表-- 创建数据库create database python_test_1 charsetutf8;-- 使用数据库use python_test_1;-- students表create table students(id int unsigned primary …

您的Apache Camel应用程序现在包括现成的文档

几个月前&#xff0c;我在博客中发布了有关即将发布的2.15版本的信息&#xff0c;该功能包括获取有关在端点上配置的每个属性的详细信息的功能-Apache Camel&#xff0c;请向我解释这些端点选项的含义 。 我们沿着这条道路继续前进&#xff0c;今天&#xff0c;我们将其从端点…

iOS全局变量与属性的内存管理

在iOS开发中&#xff0c;为了节约时间&#xff0c;程序员经常会用全局变量代替属性。但是这样做&#xff0c;尤其是新手开发中&#xff0c;经常会引起内存泄露的报错&#xff0c;其实作为苹果自己也没有给出一个完美安全的内存管理代码例子。但是在iOS开发到如今&#xff0c;有…

mysql xml格式化输出_在MySQL中使用XML数据—数据格式化

在MySQL中使用XML数据可以将数据进行格式化以更好的管理数据。有IgorRomanenko编写的MySqlDump客户端最初是一个备份程序&#xff0c;它可以备份数据库&#xff0c;或将一个数据库转移到另一个数据库(MySQL或其它数据库)&#xff0c;它的这个备份过程其实是一个创建表&#xff…

休眠锁定模式– PESSIMISTIC_READ和PESSIMISTIC_WRITE如何工作

介绍 Java Persistence API带有完善的并发控制机制&#xff0c;支持隐式和显式锁定。 隐式锁定机制很简单&#xff0c;它依赖于&#xff1a; 乐观锁定&#xff1a;实体状态更改可以触发版本增加 行级锁定&#xff1a;基于当前运行的事务隔离级别 &#xff0c;INSERT / UPDATE…

廖雪峰mysql安装教程 pdf_使用MySQL - 廖雪峰 Python 3 教程

MySQL是Web世界中使用最广泛的数据库服务器。SQLite的特点是轻量级、可嵌入&#xff0c;但不能承受高并发访问&#xff0c;适合桌面和移动应用。而MySQL是为服务器端设计的数据库&#xff0c;能承受高并发访问&#xff0c;同时占用的内存也远远大于SQLite。此外&#xff0c;MyS…

将WildFly绑定到其他IP地址或多宿主上的所有地址

用WildFly的话来说&#xff0c; 接口是一个逻辑名称&#xff0c;用于套接字可以绑定到的网络接口/ IP地址/主机名。 有两个接口&#xff1a;“公共”和“管理”。 “公共”接口绑定用于所有与应用程序相关的网络通信&#xff08;例如&#xff0c;Web&#xff0c;Messaging等&a…

MSChart中转义符

#VALX 显示当前图例的X轴的对应文本(或数据) #VAL, #VALY, 显示当前图例的Y轴的对应文本(或数据) #VALY2, #VALY3, 显示当前图例的辅助Y轴的对应文本(或数据) #SER: 显示当前图例的名称 #LABEL 显示当前图例的标签文本 #INDEX 显示当前图例的索引 #PERCE…

mysql联合查询语句详解_实例讲解MySQL联合查询

1&#xff0e; 内联结&#xff1a;Select A.Name, B.Hobby from A, B where A.id B.id&#xff0c;这是隐式的内联结&#xff0c;查询的结果是&#xff1a;NameHobbyTimFootballJimmyBasketballJimmyTennisTomSoccer它的作用和 Select A.Name from A INNER JOIN B ON A.id B.…

ci 样式路径

路径里大凡从application 里面出来的&#xff0c;都不行&#xff0c;估计这已给ci设置成不能从外面读这个目录。即便是htaccess 添加application 也不行。。。 ci的模版是都放在 views下面&#xff0c;而且可以再嵌套在views下面的其他目录里面&#xff0c;但是这个时候&#…

具有Spring Boot和数据功能的Java头优先弹性搜索

在本文中&#xff0c;我将为您提供有关如何在Java项目中使用Elastic Search的简单介绍。 由于Spring Boot是开始我们项目的最简单&#xff0c;最快的方法&#xff0c;因此我选择使用它。 此外&#xff0c;我们将大量使用心爱的Spring Data的Repository Goods。 首先&#xff0…

python 表单中值为空的还需要传入么_牛掰!100行Python,自动动手打造一款多国语言翻译软件...

大家在平时的学习或者工作中&#xff0c;往往少不了要阅读外文的文献&#xff0c;或者将外文的文献翻译成中文。这时候就需要打开网页&#xff0c;然后进行搜索&#xff0c;非常的麻烦。既然是玩Python&#xff0c;小编就带领大家来打造一款多种语言翻译的软件&#xff0c;无需…

使用Visual Studio 2010 一步一步创建Powershell Module 和 Cmdlet

之前写了一个C# 调用PowerShell方法&#xff0c; 那么怎么反过来操作呢&#xff0c;也就是怎么样用C#写一个powershell命令呢&#xff1f; 现在就用C#写一个超级简单的Module和Cmdlet 1. 在VS中创建一个Library的项目 文件->新建->项目->C#->Class Library 在这里给…

休眠锁定模式– PESSIMISTIC_FORCE_INCREMENT锁定模式如何工作

介绍 在我以前的文章中 &#xff0c;我介绍了OPTIMISTIC_FORCE_INCREMENT锁定模式&#xff0c;并将其应用于将子实体版本更改传播到锁定的父实体。 在本文中&#xff0c;我将介绍PESSIMISTIC_FORCE_INCREMENT锁定模式&#xff0c;并将其与乐观的锁定模式进行比较。 相像多于不…

Android防盗系统推荐

智游防盗是北京智游网安科技有限公司推出的一款手机防盗软件。智游防盗主要功能分为近身防盗和远程防盗。其中近身防盗包括“包包模式”&#xff0c;“静止模式”&#xff0c;“口袋模式”&#xff0c;“充电模式”四个防盗模式。开启“包包模式”后&#xff0c;当手机被拿出包…

实用程序类与函数式编程无关

最近&#xff0c;我被指控反对函数式编程&#xff0c;因为我将实用程序类称为反模式 。 绝对是错的&#xff01; 好吧&#xff0c;我确实认为它们是一种糟糕的反模式&#xff0c;但是它们与函数式编程无关。 我相信有两个基本原因。 首先&#xff0c;函数式编程是声明性的&…

MySQL5.5加主键锁读问题【转】

【来自&#xff1a;http://dinglin.iteye.com/blog/1884696】背景 有同学讨论到MySQL 5.5下给大表加主键时会锁住读的问题&#xff0c;怀疑与fast index creation有关&#xff0c;这里简单说明下。 对照现象 为了说明这个问题的原因&#xff0c;有兴趣的同学可以做对比实验。 1…