タグ付けされた質問 「java-stream」

Stream APIの使用に関連する質問には、このタグを使用します。これはJava 8で導入され、コレクションのfilter-map-reduceパイプラインなど、値のストリームに対する関数形式の操作をサポートしています。

21
Java 8 List <V>からMap <K、V>へ
Java 8のストリームとラムダを使用して、オブジェクトのリストをマップに変換したい。 これは私がJava 7以下でそれを書く方法です。 private Map&lt;String, Choice&gt; nameMap(List&lt;Choice&gt; choices) { final Map&lt;String, Choice&gt; hashMap = new HashMap&lt;&gt;(); for (final Choice choice : choices) { hashMap.put(choice.getName(), choice); } return hashMap; } Java 8とGuavaを使用してこれを簡単に達成できますが、Guavaなしでこれを行う方法を知りたいです。 グアバでは: private Map&lt;String, Choice&gt; nameMap(List&lt;Choice&gt; choices) { return Maps.uniqueIndex(choices, new Function&lt;Choice, String&gt;() { @Override public String apply(final Choice …



6
可能な場合は常に並列ストリームを使用する必要がありますか?
Java 8とラムダを使用すると、コレクションをストリームとして反復するのが簡単で、並列ストリームを使用するのと同じくらい簡単です。docsの 2つの例、2番目の例はparallelStreamを使用しています。 myShapesCollection.stream() .filter(e -&gt; e.getColor() == Color.RED) .forEach(e -&gt; System.out.println(e.getName())); myShapesCollection.parallelStream() // &lt;-- This one uses parallel .filter(e -&gt; e.getColor() == Color.RED) .forEach(e -&gt; System.out.println(e.getName())); 順序を気にしない限り、パラレルを使用することは常に有益ですか?より多くのコアで作業を分割する方が速いと思う人もいるでしょう。 他の考慮事項はありますか?並列ストリームはいつ使用し、非並列ストリームはいつ使用する必要がありますか? (この質問は、並列ストリームをいつどのように使用するかについてのディスカッションをトリガーするためのものです。常にそれらを使用することは良い考えだと思うからではありません。)

6
述語で最初の要素を見つける
私はJava 8ラムダで遊んだばかりで、関数型言語で慣れ親しんでいることのいくつかを実装しようとしています。 たとえば、ほとんどの関数型言語には、シーケンス、または述語がである最初の要素を返すリストを操作する何らかの検索関数がありtrueます。Java 8でこれを達成するために私が見ることができる唯一の方法は、次のとおりです。 lst.stream() .filter(x -&gt; x &gt; 5) .findFirst() ただし、フィルターはリスト全体をスキャンするため、これは私には非効率的です。少なくとも私の理解では(これは間違っている可能性があります)。もっと良い方法はありますか?
504 java  java-8  java-stream 

8
Java 8 Iterable.forEach()とforeachループ
OverантотвопросестьответынаStack Overflowнарусском:ЦиклforeachпротивIterable.foreachвJava 8:чтолучше? 次のうちどれがJava 8でより良い実践ですか? Java 8: joins.forEach(join -&gt; mIrc.join(mSession, join)); Java 7: for (String join : joins) { mIrc.join(mSession, join); } 私はラムダで「単純化」できるforループをたくさん持っていますが、それらを使用することには本当に何か利点がありますか?パフォーマンスと読みやすさが向上しますか? 編集 また、この質問をより長い方法に拡張します。あなたはラムダから親関数を返すこともブレークすることもできないことを知っています、そしてそれらを比較するときにこれも考慮に入れられるべきですが、他に考慮すべきことはありますか?

27
プロパティごとに異なるJava 8
Java 8ではStream、各オブジェクトのプロパティの違いをチェックすることにより、API を使用してコレクションをどのようにフィルタリングできますか? たとえば、Personオブジェクトのリストがあり、同じ名前の人を削除したい場合、 persons.stream().distinct(); Personオブジェクトのデフォルトの等価チェックを使用するため、次のようなものが必要です。 persons.stream().distinct(p -&gt; p.getName()); 残念ながら、distinct()メソッドにはそのようなオーバーロードはありません。Personクラス内の等価チェックを変更せずに、これを簡潔に行うことは可能ですか?

14
Java 8でjava.util.stream.Streamからリストを取得する
コレクションを簡単にフィルター処理するために、Java 8ラムダをいじっていました。しかし、同じステートメント内で新しいリストとして結果を取得する簡潔な方法は見つかりませんでした。これまでのところ、私の最も簡潔なアプローチは次のとおりです。 List&lt;Long&gt; sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L); List&lt;Long&gt; targetLongList = new ArrayList&lt;&gt;(); sourceLongList.stream().filter(l -&gt; l &gt; 100).forEach(targetLongList::add); 新しい結果リストを生成せずに停止したため、ネット上の例は私の質問に答えませんでした。より簡潔な方法があるはずです。私がいることを、期待したStreamクラスには、などのメソッドがありtoList()、toSet()... targetLongList3行目で変数を直接割り当てる方法はありますか?

9
Java 8 JDKを使用してIterableをStreamに変換する
私はを返すインターフェイスを持っていますjava.lang.Iterable&lt;T&gt;。 Java 8 Stream APIを使用してその結果を操作したいと思います。 ただし、Iterableは「ストリーミング」できません。 リストに変換せずにIterableをストリームとして使用する方法はありますか?

14
Java 8並列ストリームのカスタムスレッドプール
Java 8 並列ストリームのカスタムスレッドプールを指定することは可能ですか?どこにも見つかりません。 サーバーアプリケーションがあり、並列ストリームを使用したいとします。しかし、アプリケーションは大きく、マルチスレッドなので、それを区分けしたいと思います。別のモジュールからのapplicationblockタスクの1つのモジュールで実行速度の遅いタスクが必要ではありません。 異なるモジュールに異なるスレッドプールを使用できない場合、それは実際の状況のほとんどで並列ストリームを安全に使用できないことを意味します。 次の例を試してください。別のスレッドで実行されるCPU集中タスクがいくつかあります。タスクは並列ストリームを活用します。最初のタスクは壊れているため、各ステップには1秒かかります(スレッドスリープによってシミュレートされます)。問題は、他のスレッドがスタックして、壊れたタスクが完了するのを待つことです。これは不自然な例ですが、サーブレットアプリと誰かが共有フォーク結合プールに長時間実行タスクを送信するとします。 public class ParallelTest { public static void main(String[] args) throws InterruptedException { ExecutorService es = Executors.newCachedThreadPool(); es.execute(() -&gt; runTask(1000)); //incorrect task es.execute(() -&gt; runTask(0)); es.execute(() -&gt; runTask(0)); es.execute(() -&gt; runTask(0)); es.execute(() -&gt; runTask(0)); es.execute(() -&gt; runTask(0)); es.shutdown(); es.awaitTermination(60, TimeUnit.SECONDS); } private static void runTask(int …

22
Java 8でインデックスを使用してストリームを反復する簡潔な方法はありますか?
ストリーム内のインデックスにアクセスしながら、ストリームを反復する簡潔な方法はありますか? String[] names = {"Sam","Pamela", "Dave", "Pascal", "Erik"}; List&lt;String&gt; nameList; Stream&lt;Integer&gt; indices = intRange(1, names.length).boxed(); nameList = zip(indices, stream(names), SimpleEntry::new) .filter(e -&gt; e.getValue().length() &lt;= e.getKey()) .map(Entry::getValue) .collect(toList()); そこに与えられたLINQの例と比べてかなりがっかりしたようです string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" }; var nameList = names.Where((c, index) =&gt; c.Length &lt;= index + 1).ToList(); より簡潔な方法はありますか? …
382 java  java-8  java-stream 


12
Collectors.toMapのJava 8 NullPointerException
Java 8 は、値の1つが「null」の場合にCollectors.toMapaをスローしNullPointerExceptionます。私はこの振る舞いを理解していません、マップは問題なく値としてnullポインターを含むことができます。値をnullにできない正当な理由はありますCollectors.toMapか? また、これを修正するためのJava 8の優れた方法はありますか、それとも、従来のforループに戻す必要がありますか? 私の問題の例: import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; class Answer { private int id; private Boolean answer; Answer() { } Answer(int id, Boolean answer) { this.id = id; this.answer = answer; } public int getId() { return id; } public void setId(int id) { …

17
Java 8ストリーム内からCHECKED例外をスローするにはどうすればよいですか?
Java 8ストリーム/ラムダからCHECKED例外をスローするにはどうすればよいですか? つまり、次のようなコードをコンパイルしたいのです。 public List&lt;Class&gt; getClasses() throws ClassNotFoundException { List&lt;Class&gt; classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String") .map(className -&gt; Class.forName(className)) .collect(Collectors.toList()); return classes; } Class.forName()上記のメソッドClassNotFoundExceptionはチェックされているをスローするため、このコードはコンパイルされません。 チェック済みの例外をランタイム例外内にラップせず、代わりにラップされた未チェックの例外をスローしたくないことに注意してください。チェックされた例外自体をスローし、醜いtry/ catchesをストリームに追加しないでください。

4
Collection.stream()。forEach()とCollection.forEach()の違いは何ですか?
で.stream()、.filter()並列ストリームのようなチェーン操作を使用できることを理解しています。しかし、小さな操作(たとえば、リストの要素の印刷)を実行する必要がある場合、それらの違いは何ですか? collection.stream().forEach(System.out::println); collection.forEach(System.out::println);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.