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

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

9
Java 8:改行とインデントを使用したラムダのフォーマット
ラムダインデントで実現したいのは次のとおりです。 複数行のステートメント: String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)" }; List<String> strings = Arrays.stream(ppl) .filter( (x) -> { return x.contains("(M)"); } ).collect(Collectors.toList()); strings.stream().forEach(System.out::println); 1行のステートメント: List<String> strings = Arrays.stream(ppl) .map((x) -> x.toUpperCase()) .filter((x) -> x.contains("(M)")) .collect(Collectors.toList()); 現在、Eclipseは次のように自動フォーマットしています。 複数行のステートメント: String[] ppl …

5
Java8ストリームをGuavaImmutableCollectionに収集するにはどうすればよいですか?
私は次のことをしたいと思います: List<Integer> list = IntStream.range(0, 7).collect(Collectors.toList()); しかし、結果のリストがGuavaの実装であるようにImmutableList。 私は私ができることを知っています List<Integer> list = IntStream.range(0, 7).collect(Collectors.toList()); List<Integer> immutableList = ImmutableList.copyOf(list); でも直接集めたいです。私はもう試した List<Integer> list = IntStream.range(0, 7) .collect(Collectors.toCollection(ImmutableList::of)); しかし、それは例外を投げました: com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:96)でのjava.lang.UnsupportedOperationException

4
ストリームでCollections.toMap()を使用するときに、リストの反復順序を維持するにはどうすればよいですか?
私は次のようにMapからを作成してListいます: List<String> strings = Arrays.asList("a", "bb", "ccc"); Map<String, Integer> map = strings.stream() .collect(Collectors.toMap(Function.identity(), String::length)); と同じ反復順序を維持したいと思いListます。メソッドLinkedHashMapを使用してを作成するにはどうすればよいCollectors.toMap()ですか?

10
Java 8:ラムダの反復をカウントするための好ましい方法は?
私はよく同じ問題に直面します。ラムダの外部で使用するために、ラムダの実行をカウントする必要があります。例えば: myStream.stream().filter(...).forEach(item->{ ... ; runCount++); System.out.println("The lambda ran "+runCount+"times"); 問題は、runCountがfinalである必要があるため、intにすることはできないということです。不変であるため、整数にすることはできません。クラスレベルの変数(つまりフィールド)にすることもできますが、このコードブロックでのみ必要になります。私はさまざまな方法があることを知っています、私はこれのためにあなたの好ましい解決策は何ですか?AtomicIntegerまたは配列参照または他の方法を使用していますか?

6
Java8:リスト内のオブジェクトの特定のフィールドからの値の合計
クラスObjがあるとします class Obj{ int field; } そして、Objインスタンスのリストがあること、つまりList<Obj> lst。 さて、Java8で、フィルタリング基準(たとえば、オブジェクトの場合、基準は)の下で、fieldリスト内のオブジェクトからのintフィールドの値の合計をストリームで見つけるにはどうすればよいですか?lstoo.field > 10

4
Java 8:リストをストリームAPIとマージする
私は次の状況にあります Map<Key, ListContainer> map; public class ListContainer{ List<AClass> lst; } 私はすべてのリストをマージする必要があるlstからListContainerからオブジェクトMapマップ。 public static void main(String args[]){ List<AClass> alltheObjectsAClass = map.values().stream(). // continue.... } Java 8ストリームAPIを使用して、どのようにアイデアがありますか?

3
カウントで評価されない中間ストリーム操作
Javaがストリーム操作をストリームパイプラインに構成する方法を理解するのに苦労しているようです。 次のコードを実行すると public static void main(String[] args) { StringBuilder sb = new StringBuilder(); var count = Stream.of(new String[]{"1", "2", "3", "4"}) .map(sb::append) .count(); System.out.println(count); System.out.println(sb.toString()); } コンソールはのみを印刷し4ます。StringBuilderオブジェクトは、まだ価値があります""。 フィルター操作を追加すると: filter(s -> true) public static void main(String[] args) { StringBuilder sb = new StringBuilder(); var count = Stream.of(new String[]{"1", "2", "3", "4"}) …
33 java  java-stream 

2
数値が0のときに、ストリームでlimit(number)呼び出しをスキップするにはどうすればよいですか?
のオブジェクトを提供するJavaコードがいくつかありますitems。それはに基づいてそれらを制限しますmaxNumber: items.stream() .map(this::myMapper) .filter(item -> item != null) .limit(maxNumber) .collect(Collectors.toList()); それは正しく動作しますが、問題はこれです:制限をスキップする方法はありmaxNumber == 0ますか? 私はこれを行うことができることを知っています: if (maxNumber == 0) { items.stream() .map(this::myMapper) .filter(item -> item != null) .collect(Collectors.toList()); } else { items.stream() .map(this::myMapper) .filter(item -> item != null) .limit(maxNumber) .collect(Collectors.toList()); } しかし、おそらくもっと良い方法があると思いますか?


3
並列無限Javaストリームがメモリ不足になる
次のJavaプログラムがを提供する理由を理解しようとしていますがOutOfMemoryError、対応するプログラムなしで.parallel()は対応していません。 System.out.println(Stream .iterate(1, i -> i+1) .parallel() .flatMap(n -> Stream.iterate(n, i -> i+n)) .mapToInt(Integer::intValue) .limit(100_000_000) .sum() ); 2つの質問があります。 このプログラムの意図する出力は何ですか? これがない.parallel()場合、これは単純に出力するように見えますsum(1+2+3+...)。つまり、flatMapの最初のストリームで単に「行き詰まる」ということです。これは理にかなっています。 並列では、予想される動作があるかどうかはわかりませんが、それは何らかの形で最初のnストリームをインターリーブしたと思われます。ここnで、並列ワーカーの数です。また、チャンク/バッファリングの動作に基づいて少し異なる場合もあります。 メモリが不足する原因は何ですか?具体的には、これらのストリームが内部でどのように実装されるかを理解しようとしています。 何かがストリームをブロックしていると思うので、ストリームが終了せず、生成された値を取り除くことができますが、評価の順序とバッファリングが発生する場所がわかりません。 編集:必要に応じて、Java 11を使用しています。 Editt 2:どうやら同じことは単純なプログラムIntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()でも発生するので、limitではなくの怠惰に関係している可能性がありflatMapます。

5
マップとは異なる値を持つマップを作成する方法(およびBinaryOperatorを使用して正しいキーを使用する方法)
私はマップを持ってMap<K, V>おり、私の目標は重複した値を削除して、まったく同じ構造をMap<K, V>再び出力することです。重複値が見つかった場合には、一つのキー(が選択されなければならないk二つの鍵(から)k1とk1、これらの値を保持する)、このため、想定BinaryOperator<K>を与えるkからk1とk2入手可能です。 入力と出力の例: // Input Map<Integer, String> map = new HashMap<>(); map.put(1, "apple"); map.put(5, "apple"); map.put(4, "orange"); map.put(3, "apple"); map.put(2, "orange"); // Output: {5=apple, 4=orange} // the key is the largest possible 使用して私の試みはStream::collect(Supplier, BiConsumer, BiConsumer)あるビット非常に不器用とのような変更可能な操作が含まMap::putとMap::remove私は避けたいたの。 // // the key is the largest integer possible (following the example above) final …

2
このJava 8ストリームのcollect()メソッドを理解するにはどうすればよいですか?
私はint配列をListに変換しようとしていましたが、Java 8 Streamを使用するというなじみのないルートを取り、これを思いつきました Arrays.stream(arr).boxed().collect(Collectors.toList()); 私はまだこの行を完全に理解するのにまだ苦労しています、ほとんどの場合、 Collectors.toList()この場合、なぜArrayList<Integer>実装Listインターフェースが返されるのですか?なぜ、LinkedList<Integer>またはListインターフェイスに準拠していない他の総称クラスですか?ここでは、APIリストのセクションでArrayListについて簡単に説明している以外は何も見つかりません。 左のパネルは どういう意味ですか?明らかに、一般的な戻り値の型です(このコードでは)。そして、私はメソッドのジェネリック型引数だと思いますが、それらはどのように指定されていますか?Collectorインターフェースのドキュメントを調べましたが、吸収できませんでした。 Stream.collect()RArrayList<Integer><R, A>

2
サイズが不明なアンバランスなスプリッターを再バランスできますか?
を使用しStreamて、リモートで保存された不明な数のJSONファイルの異種のセットの処理を並列化したいと思います(ファイルの数は事前に不明です)。ファイルのサイズは、ファイルごとに1つのJSONレコードから、他のいくつかのファイルでは最大100,000レコードまでさまざまです。JSONレコードこの場合には、自己完結型のJSONオブジェクトは、ファイル内の1つの行として表現します。 私は本当にこれにストリームを使いたいので、これを実装しましたSpliterator: public abstract class JsonStreamSpliterator<METADATA, RECORD> extends AbstractSpliterator<RECORD> { abstract protected JsonStreamSupport<METADATA> openInputStream(String path); abstract protected RECORD parse(METADATA metadata, Map<String, Object> json); private static final int ADDITIONAL_CHARACTERISTICS = Spliterator.IMMUTABLE | Spliterator.DISTINCT | Spliterator.NONNULL; private static final int MAX_BUFFER = 100; private final Iterator<String> paths; private JsonStreamSupport<METADATA> reader = null; …

3
Java並列ストリーム-parallel()メソッドを呼び出す順序[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4日前休業。 AtomicInteger recordNumber = new AtomicInteger(); Files.lines(inputFile.toPath(), StandardCharsets.UTF_8) .map(record -> new Record(recordNumber.incrementAndGet(), record)) .parallel() .filter(record -> doSomeOperation()) .findFirst() これを書いたとき、並列はマップの後に配置されるため、スレッドはマップ呼び出しのみで生成されると想定しました。しかし、ファイルのいくつかの行は、実行ごとに異なるレコード番号を取得していました。 公式のJavaストリームドキュメントといくつかのWebサイトを読んで、ストリームが内部でどのように機能するかを理解しました。 いくつかの質問: Java並列ストリームは、ArrayList、LinkedListなどのすべてのコレクションによって実装されるSplitIteratorに基づいて機能します。これらのコレクションから並列ストリームを構築する場合、対応する分割イテレータを使用して、コレクションを分割および反復します。これは、マップの結果(つまり、レコードポジョ)ではなく、元の入力ソース(ファイル行)レベルで並列処理が発生した理由を説明しています。私の理解は正しいですか? 私の場合、入力はファイルIOストリームです。使用される分割イテレーターはどれですか? parallel()パイプラインのどこに配置してもかまいません。元の入力ソースは常に分割され、残りの中間操作が適用されます。 この場合、Javaは、ユーザーが元のソース以外のパイプラインの任意の場所に並列操作を配置できないようにする必要があります。それは、Javaストリームが内部でどのように機能するかを知らない人たちに間違った理解を与えているからです。私が知っているparallel()操作はStreamオブジェクトタイプのために、それがこのように働いている、ように定義されていたであろう。ただし、代替ソリューションを提供することをお勧めします。 上記のコードスニペットでは、入力ファイルのすべてのレコードに行番号を追加しようとしているので、順序付けする必要があります。ただし、doSomeOperation()ヘビーウェイトのロジックなので並行して適用したい。達成する1つの方法は、独自にカスタマイズした分割イテレーターを作成することです。他に方法はありますか?
11 java  java-stream 

3
Aがaの前に、Bがbの前にくるカスタムソート
私はこのような色のリストを持っています: ピンク、ブルー、レッド、ブルー、グレー、グリーン、パープル、ブラック... etc List<String> listOfColors = Arrays.asList("Pink", "Blue", "Red", "blue", "Grey", "green", "purple", "black"); いくつかの果物の色をフィルタリングするようないくつかの中間的な操作があります。今、私はそれらを順番にソートしたいフィルタリングされた結果を残しています: ブルー、ブラック、ブルー、グレー、グリーン、ピンク、パープル、レッド 私が試してみました : List<String> collect = listOfColors.stream().sorted(String::compareToIgnoreCase) .collect(Collectors.toList()); 期待どおりに動作しません。 出力は次のとおりです。 ブラック、ブルー、ブルー、グリーン、グレー、ピンク、パープル、レッド 私は以下が欲しい: ブルー、ブラック、ブルー、グレー、グリーン、ピンク、パープル、レッド

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