2016-08-24 10 views
1

最初の2つのシンプルなアイテムのために、ストリームのストリームを遅れて作成しています。しかし、私のストリームの一部はList of Stringです。リストを含むJava Lazyストリームのリスト<String>

Stream<String> streamA = Stream.concat(
     Stream.generate(item::getStringA), 
     Stream.generate(item::getStringB)) 

return Stream.concat(streamA, item.getStringList(param).stream()) 

上記の動作は同じですが、.getStringListもlazilyと呼ばれる必要があります。それをフェッチし、それをストリームの残りの部分と "マージ"する方法は私には分かりません。

答えて

2

私は、あなたが実際に何をしたいのか、

return Stream.<Supplier<Stream<String>>>of(
    () -> Stream.of(item.getStringA()), 
    () -> Stream.of(item.getStringB()), 
    () -> item.getStringList(param).stream()) 
    .flatMap(Supplier::get); 

これは完全に怠惰なStream<String>場所、例えばを生成していると思います.limit(0).count()は、私は私がいかに遠く実現し始めたストリームのコンテンツ

Stream.concat(
    Stream.of(item.getStringA(), item.getStringB()), item.getStringList(param).stream()) 
+0

findFirst()は、これが欲しかったものです。ルイスの答えが働いている間、私はこれが少なくとも「ストリーム初心者」にとってちょっと直感的だと感じます。 – Joel

1

私はこれがあなたの考えであるとは思わないと思います。 Stream.generate常には、無限ストリームを生成します。しかし、あなたが望むものに最も近いものはなまけitem.getStringList(param)を呼び出します

StreamSupport.stream(() -> item.getStringList(param).spliterator(), 0, false) 

...になるだろう。 (それは非常によくサポートされていないので、何がしたいことは、本当にStreamの使用目的の場合ではありません。)

+0

と同等になります

など、のみgetStringA()を呼び出しますitemまたは.findFirst()上の任意のメソッドを呼び出すことはありません。しかし、私はStreamSupportメソッドを見つけたことはないと思います。ストリームは私がやっていることに自然にフィットするようですが、その方法を使用して少し靴ひねりに見えます。 – Joel

+0

'StreamSupport.stream(Supplier ...)'は、端末の操作が開始された時点まで呼び出しを延期しますが、ストリームを 'Stream.concat'に渡すことはすでにストリームを終了させる効果があることに注意してください。だからあなたが思っているほど怠惰ではありません。さらに、 '0'のような任意の特性を決して渡すべきではありません。この仕様では、特性がスプライテータの特性と同一でなければならないことが明確に記載されているため、この方法を使用するときの作業内容を正確に把握する必要があります。ソースが 'List'のときは、少なくとも' ORDERED | SIZED | SUBSIZED' – Holger

-1

あなたは何ができるかは、私はわからないんだけど、あなたのitem.getStringList()

public static void main(String[] args) throws InterruptedException { 
    Item item = new Item(); 
    Stream<String> a = Stream.concat(Stream.of("A"), Stream.of("B")); 

    Stream<String> anotherStream = Stream.concat(a, item.getStringList()); 


    anotherStream.forEach(System.out::println); 
} 

private static class Item { 

    public Stream<String> getStringList() { 
     List<String> l = new ArrayList<>(); 

     l.add("C"); 
     l.add("D"); 
     l.add("E"); 
     l.add("F"); 
     final AtomicInteger i = new AtomicInteger(0); 
     return Stream.iterate(l.get(i.get()), (f) -> { 
      // Proof of laziness 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      return l.get(i.getAndIncrement()); 
     }) 
     // Iterate is by default unbound 
     .limit(l.size()); 
    } 
} 

からStreamを返すですあなたのリストはまだメモリに残っているので、このアプローチはどれほど役に立つでしょうか。

関連する問題