2016-05-16 9 views
0

メインメソッドでストリーミング操作を書き留めると誰かが私にインタビューで尋ねました。メインメソッドのJava 8ストリーム

違いがありますか?例えば

class Athlete { 

    private String name; 
    private int id; 

    public Athlete(String name,int id) { 
    this.name = name; 
    this.id = id; 
    } 
} 

public class Trial { 

    public static void main(String[] args) { 
    List<Athlete> list = new ArrayList<>(); 
    list.add(new Athlete("John", 1)); 
    list.add(new Athlete("Jim", 2)); 
    list.add(new Athlete("Jojo", 3)); 

    list.stream().forEach(System.out::print); // or any other any stream operation 
    } 
} 

だから私は今のところ、私が知っている唯一のことは、ストリームが消費されると、それが消費することができないということです...それはどんな違いがあれば知っているだけで好奇心再び。

ストリーミングのためにメモリに影響を与えたり、JVMのバッファメモリを作成したりしますか?

「はい」の場合?主な方法でこれを使わないのはなぜですか?

+1

メインメソッド/スレッドに関して特別なストリームについては何もないと思います。プロまたは反復で使用できる引数は、イテレータまたはその他のループを使用するためにも使用できます。 –

+0

あなたの返事のためにこんにちは感謝.....ちょうどその例....私はここでループについて尋ねていない...私は私たちの主な方法の中で任意のストリーム操作を書くことについて尋ねています....ありがとう –

答えて

4

「メインメソッドでストリーミング操作を書くべきか」という質問は、読み込まれた質問です。それが意味する最初のことは、mainメソッドに関して特別な何かがあるという前提です。私たちが話している操作に関係なく、あなたが任意の方法でそれらを使用する場合と使用しない場合があるという結論が出た場合、問題の方法がmainの方法である場合には別の結論になる必要はありません。

どうやら、 "should we ..."とは、実際に "私たちが避けるべきかどうか"を実際に尋ねることを意味しています。それが問題ならば、mainメソッドの特別なルールがないことに留意し、Stream APIの使用を禁止する理由がある場合、その理由は他のすべてのメソッドにも適用され、Stream APIは使用できないAPIになります。もちろん、答えは、mainメソッドでストリームAPIを禁止する理由がないということです。


メモリ消費に関してCollection.forEachメソッド呼び出しとするために、各ループの交換時に、あなたはラムダ例えばIteratorインスタンスを取引しているので、作成されたオブジェクトインスタンスの数及び大きさに何らsignifcant差がありません。 StreamのforEachメソッドを使用する場合は、アプリケーションがmainメソッドのみで構成されている場合でも、SpliteratorStreamインスタンスを追加します。 JVMによって事前に割り当てられたメモリは、それらの少数のオブジェクトによって消費されるメモリよりもはるかに大きく、オブジェクトはスレッドのローカル割り当てストアに収まる可能性が非常に高いです。つまり、JVMの外部からは、プロセスで使用されるメモリに違いはありません。

あなたは用語「バッファ」と述べたように、概念的なものあなたはすべきノウハウがストリームに関係なく、あなたがループを介してコレクションを通過するかどうかの、(forEach含む)ほとんどの操作のためのないバッファ要素を行い、そうということですまたはStreamのいずれの場合でも、コレクションのサイズのメモリスケーリングは一切割り当てられません。したがって、サンプルのように3つの要素を処理するか、3つ以上の要素を処理するかにかかわらず、その差は上記のように小さくなります。混乱を作成することができ、問題に


あなたは、クラス初期化子に並列ストリームを使用してはならないことを意味し、クラス初期化子、マルチスレッド化操作を使うべきではないということです。しかし、ストリーム操作そのものを禁止するのではなく、さらに、mainメソッドはクラス初期化子ではありません。 mainメソッドが呼び出されると、そのクラスは既に初期化されています。

+0

* "for-eachループをCollection.forEachメソッド呼び出しで置き換えるときは、ラムダインスタンス" * ... Iterable.forEach'を意味するIteratorインスタンスを交換していますか?それとも、私が誤解したことが...とにかく+1です。 –

+1

@ Jean-FrançoisSavard: 'forEach'は' Iterable'で定義されていますが、 'default'実装では' Iterator'を使用していますが、 'ArrayList'を含むほとんどのコレクションでは、これは 'Iterator'インスタンスを作成せずに反復処理を行います。それは、例えば以下のように考えるべきシナリオです。質問のコードで。このシナリオを考えながら、 'forEach'はCollectionメソッドだけでなく、より抽象的な' Iterable'インターフェースでも定義されていることを忘れてしまいました。 – Holger

2

質問には、すべてのはい/いいえの質問が2つの選択肢に限定されていると仮定しないでください。良い答えは「違いはありません」ということです。

この場合、list.foreach()list.stream().foreach()より効率的であると認識している可能性があります。

+0

こんにちは。 ..ループはちょうど例だった....実際には私はインタビューで、私はこのlist.stream()。filter(booleanを返すもの)のような何かを書いていたことを意味する。 唯一のことは..... main()にストリームを書くのは正しいのですか? –

関連する問題