首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文读懂《Effective Java》第43条:返回零长度的数组或集合,而不是null

对于一个返回null 而不是零长度数组或者集合的方法,客户端几乎每次用到该方法都可能会忘记写专门处理null 返回值的代码,进而导致NPE。...返回值为null 与性能 有时候会有程序员认为:null 返回值比零长度数组更好,因为它避免了分配数组所需要的开销,但这种观点站不住脚。...在返回值这种级别上担心性能问题是不明智的,除非分析表明这个方法是造成性能问题的真正源头 对于不返回任何元素的调用,每次返回同一个零长度数组是有可能的,因为零长度数组不可变的,而不可变对象可能被自由的共享...,没理由返回null,二是返回一个零长度的数组或者集合。...Java 的返回值为null 的做法,很可能是从C 语言沿袭过来的,在C 中,数组长度是与实际的数组分开返回的,如果返回的数组长度为0,再分配一个数组就没有任何好处了。

1.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Mongoose 实现关联查询和踩坑记录

    本文源自工作中的一个问题,在使用 Mongoose 做关联查询时发现使用 populate() 方法不能直接关联非 _id 之外的其它字段,在网上搜索时这块的解决方案也并不是很多,在经过一番查阅、测试之后...内嵌是把相关联的数据保存在同一个文档内,我们可以用对象或数组的形式来存储,这样好处是我们可以在一个单一操作内完成,可以发送较少的请求到数据库服务端,但是这种内嵌类型也是一种冗余的数据模型,会造成数据的重复...= { AuthorModel, BookModel, } 使用 Aggregate 的 $lookup 实现关联查询 MongoDB 3.2 版本新增加了 lookup 实现多表关联,在聚合管道阶段中使用...$as: 别名,关联查询返回的这个结果起一个新的名称。 如果需要指定哪些字段返回,哪些需要过滤,可定义 $project 对象,关联查询的字段过滤可使用 别名.关联文档中的字段 进行指定。...关联查询时如何关联一个非 _id 字段,一种方式是直接使用 MongoDB 原生提供的 Aggregate 聚合管道的 lookup 阶段来实现,这种方式使用起来灵活,可操作的空间更大,例如通过 as

    26.5K20

    【GraphQL】225-GraphQL真香入门教程

    、 age 等字段,而 name 返回字符串类型, age 返回数值类型。...GraphQL 查询能够遍历相关对象及其字段,使得客户端可以一次请求查询大量相关数据,而不像传统 REST 架构中那样需要多次往返查询。...另外,我们可以使用 [类型] 来表示一类数组,如: [Int] 表示整型数组; [String] 表示字符串型数组; 2....自定义返回类型 在实际开发中,我们返回的数据类型可能是一个对象,对象中可能既有 Int 类型的属性,也有 String 类型的值,等等,这里我们可以使用 自定义返回类型 来处理: //...省略其他 const...声明查询语句 这一步,还是先使用【六、使用Mutations修改数据】章节的操作逻辑,也就是先用字符串创建查询,而不使用 GraphQLObjectType 创建: const schema = buildSchema

    8.1K21

    GraphQL真香入门教程

    、 age 等字段,而 name 返回字符串类型, age 返回数值类型。...GraphQL 查询能够遍历相关对象及其字段,使得客户端可以一次请求查询大量相关数据,而不像传统 REST 架构中那样需要多次往返查询。...另外,我们可以使用 [类型] 来表示一类数组,如: [Int] 表示整型数组; [String] 表示字符串型数组; 2....自定义返回类型 在实际开发中,我们返回的数据类型可能是一个对象,对象中可能既有 Int 类型的属性,也有 String 类型的值,等等,这里我们可以使用 自定义返回类型 来处理: //...省略其他 const...声明查询语句 这一步,还是先使用【六、使用Mutations修改数据】章节的操作逻辑,也就是先用字符串创建查询,而不使用 GraphQLObjectType 创建: const schema = buildSchema

    7.3K30

    大数据技术之_22_MongoDB学习_MongoDB 的简介、下载、安装、启动、配置和关闭 + MongoDB 的基本操作 + Mongoose + 使用 java 对 MongoDB 增删改查

    如果需要修改指定的值,而不是替换,需要使用【修改操作符】来完成修改。...而 Mongoose 就是一个让我们可以通过 Node 来操作 MongoDB 的模块。   ...查询的方法:     Model.find(conditions, [projection], [options], [callback])         - 查询所有符合条件的文档,总会返回一个数组...err) {         // console.log(doc);         // 通过 find() 查询的结果,返回的对象就是 Document 对象或 Document 对象数组。         ...通过 Model 查询到结果都是 Document 对象或 Document 对象数组。

    17.8K30

    用 Mongoose 插件记录Node.js API日志

    让我们分解上面的函数,看看发生了什么: _.transform: 它是数组 .reduce 的替代品。它会迭代你对象的 keys 和 values。它提供了一个 accumulator,是第一个参数。...isEqual:此方法支持比较数组、数组缓冲区、布尔值、日期对象、错误对象、映射、数字、对象、正则表达式、集合、字符串、符号和类型化数组。...对象通过它们自己的方法比较,而不是通过继承的、可枚举的属性进行比较。函数和 DOM 节点则进行严格相等的比较,即使用 ===。 这里我们迭代每个对象的属性和值,并将它与旧对象进行比较。...this.isNew():如果你正在创建新文档,那么只需返回 next()中间件。 在 schema.post('init') 的 toObject()中: doc....它将 document 转换为 Object()和transform:false是为了不允许转换返回对象。

    2.8K40

    通过Model.find查找数据方法

    查找数据 通过Model.find方法 不传入参数会查找该表的所有数据 该方法返回值始终是数组 第一个参数 指定数据的某个键进行查找,键也能是正则表达式 const data = await User.find...select:设置查询结果的数据包含哪些键 接收列明字符串组成的数组,如果字符串前加上-则是不显示 const datas = await User.find().select(["name", "-..._id"]); // 查询所有数据 返回对象只有name limit:限制查找结果的长度 skip:设置查找结果的起式位置 sort:对查找结果排序 接收列名字符串,按照从小到大排序,如果前面加上-则会从大到小排...lean:将结果返回为普通的js对象而不是查询得到的Mongoose Documents类型对象 常用的内置字段: 字段 说明 $or 或关系 $nor 或关系取反 $gt 大于 $gte 大于等于...查询字段集合中的元素(比如从第几个之后,第N到第M个元素 通过Model.findOne方法 该方法返回符合条件的第一条数据 通过Model.findById方法 通过每个数据的_id属性查询

    1.5K30

    架构和数据库

    .updateOne({查询条件},{新对象}) 修改一个符合条件的文档 db..updateMany({查询条件},{新对象}) 同时修改多个符合条件的文档 db.....replaceOne({查询条件},{新对象}) 替换一个符合条件的文档 默认使用新对象替换旧对象 如果需要修改指定的属性,而不是替换,需要使用“修改操作符”来完成修改 db.person.update...MongoDB 数据库的连接状态 mongoose 对象中有一个 connection 属性,表示数据库连接 通过监视该对象,可以来监听数据库的连接与断开 mongoose.connection.once...,也可以是一个对象数组 callback 操作完成以后调用的回调函数 StuModel.create({ name: '孙悟空', age: 18, sex: '男',...查询结果结果会通过回调函数返回,参数必选,不传没有返回值 通过 find() 查询的结果,返回的对象就是 Document,文档对象 Document 对象是 Model 的实例 doc instanceof

    8010

    04_数据库

    .update({查询条件},{新对象},{配置}) 默认只修改一个 db..updateOne({查询条件},{新对象}) 修改一个符合条件的文档 db.....updateMany({查询条件},{新对象}) 同时修改多个符合条件的文档 db.....replaceOne({查询条件},{新对象}) 替换一个符合条件的文档 默认使用新对象替换旧对象 如果需要修改指定的属性,而不是替换,需要使用“修改操作符”来完成修改 $set 可以修改文档中的指定属性...,也可以是一个对象数组 callback 操作完成以后调用的回调函数 StuModel.create({ name: '孙悟空', age: 18, sex: '男',...查询结果结果会通过回调函数返回,参数必选,不传没有返回值 通过 find() 查询的结果,返回的对象就是 Document,文档对象 Document 对象是 Model 的实例 doc instanceof

    7010

    Nodejs学习笔记(十四)— Mongoose介绍和入门

    简介   Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具   那么要使用它,首先你得装上node.js和mongodb,关于mongodb的安装和操作介绍可以参考...连接字符串   创建一个db.js var mongoose = require('mongoose'), DB_URL = 'mongodb://localhost:27017/mongoosesample...里会用到的一种数据模式,可以理解为表结构的定义;每个schema会映射到mongodb中的一个collection,它不具备操作数据库的能力   我们先改造一下db.js,导出mongoose对象  ...  $regex  正则,用于模糊查询   $size   匹配数组大小   $maxDistance  范围查询,距离(基于LBS)   $mod     取模运算   $near   邻域查询,查询附近的位置...(基于LBS)   $exists    字段是否存在   $elemMatch  匹配内数组内的元素   $within  范围查询(基于LBS)   $box    范围查询,矩形范围(基于LBS)

    2.7K60

    MongoDB增删改查操作

    // mongoose.Schema() 是一个构造函数,要new一个实例对象 //2、设定集合规则 const courseSchema = new mongoose.Schema({ name...在项目根目录下输入以下命令导入 mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据文件 4.查询文档 find()方法 返回一组文档 // 根据条件查找文档(条件为空则查找所有文档...) Course.find().then(result => console.log(result)) // 返回文档集合(数组形式) [{ _id: 5c0917ed37ec9b03c07cf95f...5c09f1e5aeb04b22f8460965' }).then(result => { console.log(result); }); ​ // 删除多个 如果条件为空,默认删除所有文档 返回一个对象...使用id对集合进行关联 使用populate方法进行关联集合查询 // 关联集合 ​ const mongoose = require('mongoose'); // 连接数据库 mongoose.connect

    6.2K10

    mogoose 创建数据库并增删改查

    下载 npm i mongoose -s 连接数据库 const mongoose = require("mongoose"); mongoose.connect(dbURL); const db =...console.log("链接成功"); }); 创建表结构Schema Schema相当于MySql的表结构 通过定义Schema来约束数据的类型,支持以下类型数据 类型 作用 String 定义字符串...Number 定义数字 Date 定义日期 Buffer 定义二进制 Boolean 定义布尔值 Mixed 定义混合类型 ObjectId 定义对象ID Array 定义数组 Decimal128...Map 约束能用对象的方法描述数据类型 是否必须 是否重复 默认值 等,如下定义了一个用户表结构 注意:如果定义表结构时没有定义_id,mongoose会自己添加一个该字段,该字段不会重复,类型为ObjectId...,通过findById()查询 const userSachem = new mongoose.Schema( { name: { type: String

    5.1K30

    GraphQL 基础实践

    虽然这让你听起来觉得像是一款数据库软件,但实际上 GraphQL 并不是数据库软件。...再次回顾一下前面的请求体,请求体决定了返回数据的结构,而 Schema 的定义决定了端点的能力。 接下来我们就通过一个一个的例子了解一下 Schema。 类型系统、标量类型、非空类型、参数 ?...如果我们的某个字段返回不止一个标量类型的数据,而是一组,则需要使用List类型声明,在该标量类型两边使用中括号[]包围即可,与 JavaScript 中数组的写法相同,而且返回的数据也将会是数组类型。...在数据返回前查出两个 key 为 movie 的数据,合并之后由于 key 重复而只能拿到一条数据。那么在这种情况下我们需要使用别名功能。...然后在search查询中返回该接口。 searchMedia查询返回一组Basic接口。由于该接口中的字段是所有实现了该接口的类型所共有的,在请求体上可以直接使用。

    12.8K20

    Nodejs和Mongodb的连接器Mongoose

    同时它也是一个对象数据库,没有表、行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储(文档,就是一个关联数组式的对象,它的内部由属性组成,一个属性对应的值可能是一个数、字符串、日期、数组,甚至是一个嵌套的文档...安装 引用 前面我们已经认识了Mongoose,也了解了MongoDB,回顾一下:MongoDB是一个对象数据库,是用来存储数据的;Mongoose是封装了MongoDB操作的一个对象模型库,是用来操作这些数据的...MongoDB —— 是一个对象数据库,没有表、行等概念,也没有固定的模式和结构,所有的数据以Document(以下简称文档)的形式存储(Document,就是一个关联数组式的对象,它的内部由属性组成,...一个属性对应的值可能是一个数、字符串、日期、数组,甚至是一个嵌套的文档。)...、日期型、数值型、布尔型(Boolean)、null、数组、内嵌文档等。

    5.9K41
    领券