我发现使用基于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

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

  1. jdk安装教程_使用JDK 8流在包装对象的集合和包装对象的集合之间转换

    jdk安装教程 我发现使用基于Java的应用程序时,装饰器和适配器有时会很有用. 这些"包装器"在各种情况下都可以很好地工作,并且相当容易理解和实现,但是当需要包装对象的层次结构而 ...

  2. jdk 8 集合对象排序_使用JDK 8流在包装对象的集合和包装对象的集合之间转换

    jdk 8 集合对象排序 我发现使用基于Java的应用程序时, 装饰器和适配器有时会很有用. 这些"包装器"在各种情况下都能很好地工作,并且相当容易理解和实现,但是当需要包装对象的 ...

  3. java c 流_java对象传输流C/S传输对象

    java对象传输流C/S传输对象 java中有一个对象输入输出流,它可以包装普通的字节流. 我用一个C/S模式来测试练习对象输入输出流. 创建对象输入输出流包装基本字节流时遇到了第一个问题: 服务器创 ...

  4. java logging包_用JDK中提供的java.util.logging.*包创建Logger对象----原创

    由于项目中用到了Applet与Servlet之间(客户端用Applet.Server端用Servlet)的通信,要求: 1:>客户端与服务端必须出Log. 2:>浏览器在加载Applet时 ...

  5. IO流基本知识总结【字节输入输出流、字符输入输出流、转换流、对象流】

    1.概述: 流是可以承载东西的数据流:java中io流也是用来承载运输数据的. 2.分类: 1.按流向分:[参考内存:进入内存叫做输入,出内存叫做输出] 1.输入流:承载数据进入内存的流叫做输入流 2 ...

  6. ssl- 套接字对象的TLS / SSL包装器

    目录 ssl - 套接字对象的TLS / SSL包装器 函数,常量和异常 套接字创建 上下文创建 例外 随机生成 证书处理 常量 SSL套接字 SSL上下文 证书 证书链 CA证书 组合密钥和证书 自 ...

  7. 集合到文件 文件到集合 点名器 集合到文件数据排序版 标准输入流 打印流 对象序列化流 对象返序列化流 Properties 游戏次数 进程和线程 线程 多线程的实现方式 设置和获取线程名称

    文章目录 集合到文件 文件到集合 点名器 集合到文件数据排序版 标准输入流 打印流 对象序列化流 对象返序列化流 Properties 游戏次数 进程和线程 线程 多线程的实现方式 设置和获取线程名称 ...

  8. 内置对象的API Array数组对象 String字符串对象 json字符串 JSON对象 js作用域及变量预解析 引用类型与值类型区别 共享引用 基本包装类型 数组去重

    01-内置对象的API a.Date对象获取时间 b.Array对象数组加工 c.String对象字符串加工 d.json字符串的语法格式 e.JSON对象的字符串与对象转换应用 02-JS作用域 a ...

  9. Java提高—对象克隆(复制)/对象属性拷贝

    对象克隆(复制)假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byt ...

最新文章

  1. 前端运行python代码几种方式_前的解释|前的意思|汉典“前”字的基本解释
  2. ElasticSearch Shard——本质上是做分布式扩展,副本对于集群的稳定性有很强的影响...
  3. error: No resource identifier found for attribute ‘backIcon’ in package
  4. weblogic 的域信任问题
  5. 【Vulnhub靶机系列】DC3
  6. js按照指定月份确认该月的开始时间和结束时间
  7. 人工智能泰斗迈克尔·乔丹分享机器学习要义:创新视角,直面挑战
  8. JQuery框架2.位置属性|筛选方法|事件
  9. python中使用什么导入模块-python—模块导入和类
  10. linux socket 结构定义 send,Linux下Socket编程中用send发送结构体
  11. StrangeIoC —— Unity MVC 专属框架
  12. discuz mysql配置文件_MySQL优化配置文件my.ini(discuz论坛)
  13. 解决VS2019配置QT6.1.1出现大量错误信息
  14. C/C++ 银行账户管理系统
  15. 无涯教程: Laravel 8 - Excel和CSV介绍
  16. 【天光学术】新闻学论文:校园网络流行语传播社会热点问题的途径(节选)
  17. 【Latex格式】双栏双图左右并排有小标题、上下并列有小标题
  18. ubuntu设置开机启动程序
  19. 计算机应用基础win,计算机应用基础(Win 7+Office 2010)
  20. 搜索引擎登录站点-提交网站(大全)

热门文章

  1. MyBatis中增删改操作
  2. 不安装cudnn可不可以_Linux非root用户如何优雅的安装cuda和cudnn
  3. 2020最新Java线程池入门(超详细)
  4. leetcode初级算法3.存在重复元素
  5. 一个会定时完成的任务(二)
  6. apache kafka_使用Apache Kafka,Kubernetes和Envoy,Istio,Linkerd的服务网格和云原生微服务...
  7. 化学专业尽早转行_尽早查看针对Java 11的功能
  8. spring 导出csv_Spring批处理CSV处理
  9. 逻辑建模与物理建模_架构层和建模域逻辑
  10. aix pax_通过Pax考试对JBoss Fuse 6.x进行集成测试,第一部分