2015-09-20 34 views
8

com.fasterxml.jackson.databind.node.ArrayNodeからストリームを作成することはできますか?
は、私が試した:ArrayNodeからJava 8ストリームを作成

ArrayNode files = (ArrayNode) json.get("files"); 
Stream<JsonNode> stream = Stream.of(files); 

しかし、それは実際には1つの要素、初期ArrayNodeオブジェクトのストリームを提供します。
正しい結果がStream<JsonNode>である必要がありますか?

+1

ここで配列全体がメモリにロードされますか?私は答えが「はい」だと信じています。だからここにストリームを持っているのは何ですか? –

+0

@AndreyKarayvanskyそれはパフォーマンスに関してではなく、 ''関数的な方法で( 'map'、' filter'、 'collect'などのメソッドを使って)' ArrayNode'コレクションを処理する 'Java 8 Stream API'メソッドを使用する能力についてです。 。 – icl7126

答えて

9

ArrayNodeIterableを実装します。 Iterableにはspliterator()メソッドがあります。それはあなたが(StreamSupportを活用することで)ストリームを作成するためにそれを使用できる要素だ上

StreamSupport.stream(spliterator, false) 
4

ArrayNodeの#要素を使用して次のことができcreate a sequential Stream from a Spliterator Iteratorを返します。 StreamSupportにはSpliteratorが必要で、IteratorからSpliteratorを作成するには、Spliteratorsクラスを使用できます。

ArrayNode files = (ArrayNode) json.get("files"); 
    Stream<JsonNode> elementStream = StreamSupport.stream(Spliterators 
        .spliteratorUnknownSize(files.elements(), 
         Spliterator.ORDERED),false); 

cyclops-streamsStreamUtilsクラスは、このビットクリーナー(私は作者午前)になり、静的メソッドを持っています。 ArrayNodeはあなたがArrayNodeに渡し、直接バックストリームを取得することができますStreamUtilsと反復可能であることを考慮@JB Nizetの答えを考慮

ArrayNode files = (ArrayNode) json.get("files"); 
Stream<JsonNode> elementStream = StreamUtils.stream(files.elements()); 

Stream<JsonNode> elementStream = StreamUtils.stream((ArrayNode) json.get("files")); 
7

ArrayNodeクラスは、ランダムアクセスを提供します:あなたは(get(index)を使用して)インデックスでsize()と要素を取得することができます。このソリューションは、それがうまく分割し、適切にサイズを報告することができますよう(他の回答で示唆したように)デフォルトのspliteratorを使用するよりも優れていること

Stream<JsonNode> nodes = IntStream.range(0, files.size()).mapToObj(files::get); 

注:これは、あなたが良いストリームを作成するために必要なすべてのです。並列処理を気にしなくても、toArray()のような操作は、事前にサイズを知ることが適切なサイズの配列を割り当てるのに役立つので、より効果的に機能します。

+0

私はあなたが言ったすべてに同意し、これは多くの点でより優れた解決策です。しかし、私は 'ArrayNode'クラスやいくつかの' Utils'メソッドで直接このような解決策を見ています。ストリームは、コードを読みやすく理解しやすくするはずです。単純なフィルタマップ収集操作にこのソリューションを使用すると、コードの複雑さがわずかに増加します。とにかく、非常に良い考え、あなたは私の+1を持っています。 – icl7126

+0

@klerik、Java APIとの互換性を維持しながらストリームAPIメソッドを提供するのは簡単ではありません。 –

関連する問題