当前位置: 首页 > news >正文

旅游网站排名相关推荐注册qq空间网站

旅游网站排名相关推荐,注册qq空间网站,wordpress 发件邮箱,wordpress怎么提速Java 8中引入了Stream API和Lambda功能 #xff0c;使我们能够从JDBC ResultSet优雅地转换为仅提供映射功能的对象流。 这种功能当然可以是lambda。 基本上#xff0c;这个想法是使用ResultSet作为Supplier来生成Stream#xff1a; public class ResultSetSupplier impleme… Java 8中引入了Stream API和Lambda功能 使我们能够从JDBC ResultSet优雅地转换为仅提供映射功能的对象流。 这种功能当然可以是lambda。 基本上这个想法是使用ResultSet作为Supplier来生成Stream public class ResultSetSupplier implements SupplierT{private final ResultSet rs;private final FunctionResultSet, T mappingFunction;private ResultSetSupplier(ResultSet rs,FunctionResultSet, T mappingFunction) {this.rs rs;this.mappingFunction mappingFunction;}Overridepublic T get() {try {if (rs.next())return mappingFunction.apply(rs);} catch (SQLException e) {e.printStackTrace();}return null;}} 参数mappingFunction可能是lambda表达式用于从ResultSet构建T实例。 就像ActiveRecord模式一样此类ResultSet中的每一行都映射到T的实例其中列是T的属性。让我们考虑类City public class City{String city;String country;public City(String city, String country) {this.city city;this.country country;}public String getCountry() {return country;}Overridepublic String toString() {return City [city city , country country ;];}Overridepublic int hashCode() {final int prime 31;int result 1;result prime * result ((city null) ? 0 : city.hashCode());result prime * result ((country null) ? 0 : country.hashCode());return result;}Overridepublic boolean equals(Object obj) {if (this obj)return true;if (obj null)return false;if (getClass() ! obj.getClass())return false;City other (City) obj;if (city null) {if (other.city ! null)return false;} else if (!city.equals(other.city))return false;if (country null) {if (other.country ! null)return false;} else if (!country.equals(other.country))return false;return true;}} City对象的映射函数可以是lambda表达式如下所示 (ResultSet rs) - {try{return new City(rs.getString(city), rs.getString(country));} catch (Exception e) {return null;}} 我们假设数据库列分别称为city和country 。 尽管PreparedStatement和ResultSet都实现了AutoCloseable接口但必须提供resultSet才能创建对象流但在关闭流时也必须关闭此类resultSet。 一种可能的方法是使用代理来拦截对象流上的方法调用。 因此当在代理上调用close方法时它将在提供的resultSet上调用close 。 为了能够提供所有Stream功能所有方法调用也将在对象流上被调用。 使用代理很容易实现。 我们来看一下。 我们将有一个代理工厂和一个调用处理程序 public class ResultSetStreamInvocationHandlerT implements InvocationHandler{private StreamT stream; // proxy will intercept method calls to such streamprivate PreparedStatement st;private ResultSet rs;public void setup(PreparedStatement st, FunctionResultSet, T mappingFunction)throws SQLException{// PreparedStatement must be already setup in order// to just call executeQuery()this.st st;rs st.executeQuery();stream Stream.generate(new ResultSetSupplier(rs, mappingFunction));}Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {if (method null)throw new RuntimeException(null method null);// implement AutoCloseable for PreparedStatement// as calling close() more than once has no effectsif (method.getName().equals(close) args null){// invoked close(), no argumentsif (st ! null){st.close(); // closes ResultSet too}}return method.invoke(stream, args);}private class ResultSetSupplier implements SupplierT{private final ResultSet rs;private final FunctionResultSet, T mappingFunction;private ResultSetSupplier(ResultSet rs, FunctionResultSet, T mappingFunction) {this.rs rs;this.mappingFunction mappingFunction;}Overridepublic T get() {try {if (rs.next())return mappingFunction.apply(rs);} catch (SQLException e) {e.printStackTrace();}return null;} }} 请注意如何使用invoke来拦截方法调用。 在接近的情况下被调用时 关闭调用的PreparedStatement为好。 对于每个调用的方法将在代理的流中调用相应的方法调用。 和工厂 public class ResultSetStreamT{SuppressWarnings(unchecked)public StreamT getStream(PreparedStatement st,FunctionResultSet, T mappingFunction) throws SQLException{final ResultSetStreamInvocationHandlerT handler new ResultSetStreamInvocationHandlerT();handler.setup(st, mappingFunction);StreamT proxy (StreamT) Proxy.newProxyInstance(getClass().getClassLoader(),new Class?[] {Stream.class},handler);return proxy;} } 综上所述让我们编写一个简单的测试来显示用法。 Mockito将用于模拟PreparedStatement和ResultSet以避免对实际数据库运行测试。 public class ResultSetStreamTest {private class City{String city;String country;public City(String city, String country) {this.city city;this.country country;}public String getCountry() {return country;}Overridepublic String toString() {return City [city city , country country ];}Overridepublic int hashCode() {final int prime 31;int result 1;result prime * result getOuterType().hashCode();result prime * result ((city null) ? 0 : city.hashCode());result prime * result ((country null) ? 0 : country.hashCode());return result;}Overridepublic boolean equals(Object obj) {if (this obj)return true;if (obj null)return false;if (getClass() ! obj.getClass())return false;City other (City) obj;if (!getOuterType().equals(other.getOuterType()))return false;if (city null) {if (other.city ! null)return false;} else if (!city.equals(other.city))return false;if (country null) {if (other.country ! null)return false;} else if (!country.equals(other.country))return false;return true;}private ResultSetStreamTest getOuterType() {return ResultSetStreamTest.this;}}private String[][] data new String[][]{{Karachi, Pakistan},{Istanbul, Turkey},{Hong Kong, China},{Saint Petersburg, Russia},{Sydney, Australia},{Berlin, Germany},{Madrid, Spain}};private int timesCalled;private PreparedStatement mockPST;private ResultSet mockRS;Beforepublic void setup() throws SQLException{timesCalled -1;mockRS mock(ResultSet.class);mockPST mock(PreparedStatement.class);when(mockRS.next()).thenAnswer(new AnswerBoolean() {Overridepublic Boolean answer(InvocationOnMock invocation) throws Throwable {if (timesCalled data.length)return false;return true;}});when(mockRS.getString(eq(city))).thenAnswer(new AnswerString() {Overridepublic String answer(InvocationOnMock invocation) throws Throwable {return data[timesCalled][0];}});when(mockRS.getString(eq(country))).thenAnswer(new AnswerString() {Overridepublic String answer(InvocationOnMock invocation) throws Throwable {return data[timesCalled][1];}});when(mockPST.executeQuery()).thenReturn(mockRS);}Testpublic void simpleTest() throws SQLException{try (StreamCity testStream new ResultSetStreamCity().getStream(mockPST,(ResultSet rs) - {try {return new City(rs.getString(city), rs.getString(country));} catch (Exception e) {return null;}})){IteratorCity cities testStream.filter(city - !city.getCountry().equalsIgnoreCase(China)).limit(3).iterator();assertTrue(cities.hasNext());assertEquals(new City(Karachi, Pakistan), cities.next());assertTrue(cities.hasNext());assertEquals(new City(Istanbul, Turkey), cities.next());assertTrue(cities.hasNext());assertEquals(new City(Saint Petersburg, Russia), cities.next());assertFalse(cities.hasNext());}}} 在Github上下载完整的源代码。 翻译自: https://www.javacodegeeks.com/2014/09/creating-an-object-stream-from-a-jdbc-resultset.html
http://www.zqtcl.cn/news/882193/

相关文章:

  • 闽侯县建设局网站企业建设网站例文
  • 家居类企业响应式网站搭建电商系统
  • 临沂哪里做网站比较好中国建设银行企业信息门户网站
  • 低价建网站提高网站订单转化率
  • 家居网站应该怎么做网站seo推广软件
  • 旅游网站建设报告关键词优化排名价格
  • 上海网站开发caiyiduo微信建微网站
  • 做网站和做网店哪个好用cms做单页网站怎么做
  • 阿里云有主体新增网站可以免费制作网页的网站
  • 网站备案幕布拍照是什么莱芜网络推广公司服务
  • 招个网站建设维护国家高新技术企业官网
  • 建设医疗网站做企业官网哪家公司好
  • 网站建设常见问题及解决办法站长网站大全
  • 二手网站建设模块500做网站
  • 建设展示型网站公司哪家好广告制作费和广告服务费区别
  • 网站排版设计欣赏网站建设制作设计seo优化南宁
  • 长春网站建设公司十佳wordpress在哪注册
  • 手机号码定位网站开发世界知名外贸网站
  • 广西南宁网站建设排行榜建设一个视频网站己18
  • 以小说名字做网站的小说网最热门的网页游戏排行
  • 微网站菜单商品详情页面模板html
  • 免费word模板网站WordPress用户聊天功能
  • 网站显示图片标记wordpress文章分类div布局
  • 专业网站建设公司哪家专业阿里云二级域名建设网站
  • 返利网站怎么做手机网页前端开发
  • 做家教去什么网站人际网络网络营销是什么
  • 潮州外贸网站建设网站qq在线状态
  • 旅游网站开发背景及意义湖南城市建设网站
  • 西安网站开发托管代运营wordpress给外部链接加上跳转
  • 网站设计深圳企业为什么做网站素材