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

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

4
Java 8で型を変換するreduceメソッドにコンバイナーが必要なのはなぜですか
combinerStreams reduceメソッドで果たす役割を十分に理解できません。 たとえば、次のコードはコンパイルされません。 int length = asList("str1", "str2").stream() .reduce(0, (accumulatedInt, str) -> accumulatedInt + str.length()); コンパイルエラーは言う:( 引数の不一致; intはjava.lang.Stringに変換できません) しかし、このコードはコンパイルします: int length = asList("str1", "str2").stream() .reduce(0, (accumulatedInt, str ) -> accumulatedInt + str.length(), (accumulatedInt, accumulatedInt2) -> accumulatedInt + accumulatedInt2); 私はコンバイナーメソッドが並列ストリームで使用されていることを理解しています。つまり、私の例では、2つの中間累積整数を加算しています。 しかし、最初の例がコンバイナなしでコンパイルできない理由や、2つのintを加算するだけなので、コンバイナが文字列からintへの変換をどのように解決するのか理解できません。 誰かがこれに光を当てることができますか?
141 java  java-8  java-stream 

4
Java 8:ストリームとコレクションのパフォーマンス
Java 8は初めてです。APIの詳細はまだわかりませんが、新しい非公式のベンチマークを作成して、新しいStreams APIと古き良きコレクションのパフォーマンスを比較しました。 このテストでは、のリストをフィルタリングし、Integer偶数ごとに平方根を計算しての結果Listに格納しDoubleます。 これがコードです: public static void main(String[] args) { //Calculating square root of even numbers from 1 to N int min = 1; int max = 1000000; List<Integer> sourceList = new ArrayList<>(); for (int i = min; i < max; i++) { sourceList.add(i); } List<Double> result = new …

7
Java 8でラムダを使用してMap <K、V>を別のMap <K、V>に変換するにはどうすればよいですか?
私はJava 8を検討し始めたばかりで、ラムダを試してみるために、最近書​​いた非常に単純なものを書き直そうと思った。文字列から列へのマップを別の文字列から列へのマップに変換する必要があります。新しいマップの列は、最初のマップの列の防御コピーです。列にはコピーコンストラクタがあります。これまでのところ最も近いのは: Map&lt;String, Column&gt; newColumnMap= new HashMap&lt;&gt;(); originalColumnMap.entrySet().stream().forEach(x -&gt; newColumnMap.put(x.getKey(), new Column(x.getValue()))); しかし、もっと良い方法があるはずだと私は確信しており、アドバイスをいただければ幸いです。
140 java  map  lambda  java-8  java-stream 

6
Javaストリームでは、デバッグのみを目的としていますか?
私はJavaストリームについて読んでいて、進むにつれて新しいものを発見しています。私が見つけた新しいものの1つはpeek()機能でした。私がピークで読んだほとんどすべては、それをストリームのデバッグに使用する必要があると述べています。 各アカウントにユーザー名、パスワードフィールド、login()メソッドとlogsIn()メソッドが含まれるストリームがある場合はどうなりますか。 私も持っています Consumer&lt;Account&gt; login = account -&gt; account.login(); そして Predicate&lt;Account&gt; loggedIn = account -&gt; account.loggedIn(); なぜこれがそんなに悪いのでしょうか? List&lt;Account&gt; accounts; //assume it's been setup List&lt;Account&gt; loggedInAccount = accounts.stream() .peek(login) .filter(loggedIn) .collect(Collectors.toList()); 今、私が知る限り、これは意図したとおりに動作します。それ; アカウントのリストを取得します 各アカウントへのログインを試みます ログインしていないアカウントを除外します ログインしたアカウントを新しいリストに収集します このようなことの欠点は何ですか?続行しない理由はありますか?最後に、このソリューションでない場合はどうなりますか? これの元のバージョンは、次のように.filter()メソッドを使用しました。 .filter(account -&gt; { account.login(); return account.loggedIn(); })
137 java  java-8  java-stream  peek 

1
Java 8 Streamを使用して、いくつかのクラスプロパティからリストを取得するにはどうすればよいですか?
私は持っていList&lt;Person&gt;ます。のListプロパティからを取得する必要がありますPerson。 たとえば、私はPersonクラスを持っています: class Person { private String name; private String birthDate; public String getName() { return name; } public String getBirthDate() { return birthDate; } Person(String name) { this.name = name; } } List&lt;Person&gt; personList = new ArrayList&lt;&gt;(); personList.add(new Person("David")); personList.add(new Person("Joe")); personList.add(new Person("Michel")); personList.add(new Person("Barak")); 次のStreamように、APIを使用して名前のリストを取得します。 List&lt;String&gt; names = …


5
Javaでは、ループよりもストリームの利点は何ですか?[閉まっている]
休業。この質問はもっと集中する必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 3年前休業。 この質問を改善する 私はインタビューでこれを尋ねられました、そして私が私が持つことができる最良の答えを与えたと確信していません。並列検索を行うことができ、null値は私が覚えていない方法で処理されたと述べました。今、私はオプションを考えていたことがわかります。ここで何が欠けていますか?彼らはそれがより良いかより簡潔なコードであると主張していますが、私が同意するかどうかはわかりません。 それがどれほど簡潔に回答されたかを考えると、これは結局のところ、質問の幅が広すぎなかったようです。 彼らがインタビューでこの質問をしている場合、そして明らかにそうである場合、答えを見つけるのを難しくする以外に、それを破壊する目的は何ですか?つまり、何を探しているのですか?私は質問を分解してすべてのサブ質問に回答させることができますが、すべてのサブ質問へのリンクを含む親質問を作成します...しかしかなりばかげているようです。その間、あまり一般的でない質問の例を挙げてください。この質問の一部だけを尋ねても、意味のある答えを得る方法は知りません。同じ質問を別の方法で行うこともできます。たとえば、「ストリームにはどのような目的がありますか?」または「forループの代わりにストリームを使用するのはいつですか?」または「なぜforループの代わりにストリームを使用するのですか?」これらはすべてまったく同じ質問ですが。 ...または誰かが非常に長いマルチポイントの回答をしたため、広すぎると考えられますか?率直に言って、知っている人ならだれでも、事実上どんな質問でもそれを行うことができます。たとえば、あなたがたまたまJVMの作者の1人である場合、私たちのほとんどができなかった1日中forループについて話すことができます。 「質問を編集して、適切な回答を特定するのに十分な詳細のある特定の問題に限定してください。複数の個別の質問を一度に行うことは避けてください。この質問を明確にするために、質問ページを参照してください。」 以下に示すように、適切な回答が提供されており、1つあり、提供するのが簡単であることを証明しています。

10
ストリームをコピーして、「ストリームはすでに操作されているか、閉じられています」
2回処理できるように、Java 8ストリームを複製したいと思います。私ができるcollectことから、新たなストリームを取得し、リストのように。 // doSomething() returns a stream List&lt;A&gt; thing = doSomething().collect(toList()); thing.stream()... // do stuff thing.stream()... // do other stuff しかし、もっと効率的でエレガントな方法があるべきだと思います。 コレクションに変換せずにストリームをコピーする方法はありますか? 私は実際にはEithersのストリームで作業しているので、右のプロジェクションに移動して別の方法で処理する前に、左のプロジェクションを1つの方法で処理したいとします。このようなもの(これまでのところ、私はtoListトリックを使用することを余儀なくされています)。 List&lt;Either&lt;Pair&lt;A, Throwable&gt;, A&gt;&gt; results = doSomething().collect(toList()); Stream&lt;Pair&lt;A, Throwable&gt;&gt; failures = results.stream().flatMap(either -&gt; either.left()); failures.forEach(failure -&gt; ... ); Stream&lt;A&gt; successes = results.stream().flatMap(either -&gt; either.right()); successes.forEach(success -&gt; ... );

3
基準に一致する最初の要素を取得します
ストリームの基準に一致する最初の要素を取得するにはどうすればよいですか?私はこれを試しましたが動作しません this.stops.stream().filter(Stop s-&gt; s.getStation().getName().equals(name)); その基準が機能しておらず、フィルターメソッドがStop以外のクラスで呼び出されています。 public class Train { private final String name; private final SortedSet&lt;Stop&gt; stops; public Train(String name) { this.name = name; this.stops = new TreeSet&lt;Stop&gt;(); } public void addStop(Stop stop) { this.stops.add(stop); } public Stop getFirstStation() { return this.getStops().first(); } public Stop getLastStation() { return this.getStops().last(); } …
121 java  java-8  java-stream 


6
ワンライナーでストリーム/リストの最後の要素を取得する
次のコードでストリームまたはリストの最後の要素を取得するにはどうすればよいですか? どこdata.careasでList&lt;CArea&gt;: CArea first = data.careas.stream() .filter(c -&gt; c.bbox.orientationHorizontal).findFirst().get(); CArea last = data.careas.stream() .filter(c -&gt; c.bbox.orientationHorizontal) .collect(Collectors.toList()).; //how to? ご覧のとおり、最初の要素を特定filterので取得することは難しくありません。 ただし、ワンライナーの最後の要素を取得するのは本当に大変です。 から直接入手できないようStreamです。(それは有限のストリームに対してのみ意味があります) また、インターフェイスのようなものを取得できないようfirst()で、これは本当に苦痛です。last()List インターフェース内にfirst()とlast()メソッドを提供しないことについてはList、そこにある要素が順序付けられており、サイズがわかっているため、私は何の議論も見ていません。 しかし、元の答えのとおり:有限の最後の要素を取得する方法はStream? 個人的に、これは私が得ることができる最も近いものです: int lastIndex = data.careas.stream() .filter(c -&gt; c.bbox.orientationHorizontal) .mapToInt(c -&gt; data.careas.indexOf(c)).max().getAsInt(); CArea last = data.careas.get(lastIndex); ただしindexOf、すべての要素でon を使用する必要があります。これは、パフォーマンスを損なう可能性があるため、通常は必要ない可能性があります。
118 java  list  java-8  java-stream 


20
ストリームから連続するペアを収集する
のようなストリームを考えると{ 0, 1, 2, 3, 4 }、 どのようにして最もエレガントにそれを与えられた形式に変換できますか? { new Pair(0, 1), new Pair(1, 2), new Pair(2, 3), new Pair(3, 4) } (もちろん、私はクラスPairを定義したと仮定します)? 編集:これは、厳密にはintやプリミティブストリームに関するものではありません。答えは、あらゆるタイプのストリームに対して一般的である必要があります。
102 java  java-8  java-stream 

5
いつストリームを使用する必要がありますか?
Listとそのstream()方法を使用しているときに質問を見つけました。私が知っている間どのようにそれらを使用するために、私は約かなりよく分からないときにそれらを使用します。 たとえば、さまざまな場所へのさまざまなパスを含むリストがあります。ここで、与えられた単一のパスに、リストで指定されたパスが含まれているかどうかを確認したいと思います。boolean条件が満たされたかどうかに基づいてを返したいのですが。 もちろん、これ自体は難しい作業ではありません。しかし、ストリームを使用する必要があるのか​​、それともfor(-each)ループを使用する必要があるのか​​と思います。 リスト private static final List&lt;String&gt; EXCLUDE_PATHS = Arrays.asList(new String[]{ "my/path/one", "my/path/two" }); 例-ストリーム private boolean isExcluded(String path){ return EXCLUDE_PATHS.stream() .map(String::toLowerCase) .filter(path::contains) .collect(Collectors.toList()) .size() &gt; 0; } 例-For-Eachループ private boolean isExcluded(String path){ for (String excludePath : EXCLUDE_PATHS) { if(path.contains(excludePath.toLowerCase())){ return true; } } return false; } pathパラメータは常に小文字であることに注意してください。 私の最初の推測は、条件が満たされればループがすぐに戻るため、for-eachアプローチの方が速いということです。一方、ストリームはフィルタリングを完了するためにすべてのリストエントリをループします。 …

9
Java 8での複数のnullチェック
複数のnullチェックに対して少し醜い以下のコードがあります。 String s = null; if (str1 != null) { s = str1; } else if (str2 != null) { s = str2; } else if (str3 != null) { s = str3; } else { s = str4; } だからOptional.ofNullable、以下のように使ってみましたが、誰かが私のコードを読んでいるかどうかはまだわかりません。Java 8でそれを行うための最良のアプローチは何ですか? String s = Optional.ofNullable(str1) .orElse(Optional.ofNullable(str2) .orElse(Optional.ofNullable(str3) .orElse(str4))); Java …

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