构建 API 对象
编辑构建 API 对象
编辑构建器对象
编辑Java API 客户端中的所有数据类型都是不可变的。对象的创建使用 构建器模式,该模式在 2008 年的 Effective Java 中普及开来。
ElasticsearchClient client = ... CreateIndexResponse createResponse = client.indices().create( new CreateIndexRequest.Builder() .index("my-index") .aliases("foo", new Alias.Builder().isWriteIndex(true).build() ) .build() );
请注意,构建器的 build()
方法被调用后,不应再重复使用。
构建器 lambda 表达式
编辑尽管这种方式很好用,但必须实例化构建器类并调用 build()
方法有点冗长。因此,Java API 客户端中的每个属性 setter 也接受一个 lambda 表达式,该表达式将新创建的构建器作为参数,并返回一个已填充的构建器。上面的代码片段也可以写成如下形式:
ElasticsearchClient client = ... CreateIndexResponse createResponse = client.indices() .create(createIndexBuilder -> createIndexBuilder .index("my-index") .aliases("foo", aliasBuilder -> aliasBuilder .isWriteIndex(true) ) );
这种方法允许代码更加简洁,并且由于类型是从方法参数签名中推断出来的,因此也避免了导入类(甚至记住它们的名称)。
请注意,在上面的示例中,构建器变量仅用于启动属性 setter 链。因此,这些变量的名称并不重要,可以缩短以提高可读性。
ElasticsearchClient client = ... CreateIndexResponse createResponse = client.indices() .create(c -> c .index("my-index") .aliases("foo", a -> a .isWriteIndex(true) ) );
对于像下面这样从 intervals 查询 API 文档中提取的复杂嵌套查询,构建器 lambda 表达式尤其有用。
此示例还突出了深度嵌套结构中构建器参数的有用命名约定。对于具有单个参数的 lambda 表达式,Kotlin 提供了隐式的 it
参数,而 Scala 允许使用 _
。这可以在 Java 中通过使用下划线或后跟表示深度级别的数字的单个字母前缀来近似(即 _0
、_1
或 b0
、b1
等)。这不仅消除了创建临时变量名的需要,还提高了代码的可读性。正确的缩进也使查询的结构突出显示。
ElasticsearchClient client = ... SearchResponse<SomeApplicationData> results = client .search(b0 -> b0 .query(b1 -> b1 .intervals(b2 -> b2 .field("my_text") .allOf(b3 -> b3 .ordered(true) .intervals(b4 -> b4 .match(b5 -> b5 .query("my favorite food") .maxGaps(0) .ordered(true) ) ) .intervals(b4 -> b4 .anyOf(b5 -> b5 .intervals(b6 -> b6 .match(b7 -> b7 .query("hot water") ) ) .intervals(b6 -> b6 .match(b7 -> b7 .query("cold porridge") ) ) ) ) ) ) ), SomeApplicationData.class );
以上示例的源代码可以在 Java API 客户端测试中找到。