私はJavaストリームを理解するのに少し問題があります。基本的に要素をデータベースに格納し、取得し(結果はストリームで返されます)、次に両方の要素を比較するJUnitテストを作成しました。テストに失敗したので、デバッグを開始しました。突然テストが合格した。私のブレークポイントは、ストリームを作るのに必要な時間を与えましたか?ストリームは常に空です - 私が時間を与えない限り
データベースとしてElasticsearchと@Test
public void matchAllTest() {
client.insert(object); //database schema is empty
Stream<Object> stream = client.query("{ query matching all objects }");
Object firstResult = stream.findFirst().get();
assertObjectEquals(object, firstResult);
}
query
作品と次のようになります試験に
public Stream<Object> query(String query) {
SearchRequestBuilder request = client.prepareSearch("index");
request.setQuery(query);
Stream.Builder<Object> stream = Stream.builder();
SearchResponse response = request.get();
SearchHits hits = response.getHits();
hits.forEach(object -> stream.accept(object);
return stream.build();
}
client
はquery
方法でクラスを指します。 2番目のコードスニペットのclient
は、Elasticsearchノードクライアントを指します。ES Java docsを参照してください。
NoSuchElementException(「値はありません」)でテストが失敗します。時間を与えない限り、テストは失敗します。
ここでは正確に何が起こっていますが、どうすれば例外を回避できますか?
'query'メソッドは非同期ですか? 「クライアント」とは何ですか? –
'client'はデータベース(Elasticsearch)に接続し、オブジェクトを格納し検索する' query'のようなメソッドを提供します。 Elasticsearchの文書では、「実行された操作は本質的に非同期である」と述べています。私は 'query'メソッドを同期としてラベルしようとしましたが、それは役に立たなかった。 – Felix
'client'はどんなタイプですか?私は普通の 'query'メソッドを公開しているドキュメントの型を見つけることができませんでした。私をドキュメントにリンクさせる心ですか? [序文](https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-api.html)は、「*リスナーを受け入れるか、将来を返すか」と述べています。クライアントにリスナーをアタッチするか、メソッドの引数としてコールバック関数を渡して、アクション(クエリ)が完了したら通知することができます。 –