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

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

9
Stream <T>がIterable <T>を実装しないのはなぜですか?
Java 8では、クラスStream &lt;T&gt;があり、奇妙なことにメソッドがあります Iterator&lt;T&gt; iterator() そのため、このメソッドを必要とするIterable &lt;T&gt;インターフェースの実装が期待されますが、そうではありません。 foreachループを使用してストリームを反復処理する場合は、次のようにする必要があります public static Iterable&lt;T&gt; getIterable(Stream&lt;T&gt; s) { return new Iterable&lt;T&gt; { @Override public Iterator&lt;T&gt; iterator() { return s.iterator(); } }; } for (T element : getIterable(s)) { ... } ここで何か不足していますか?


7
ストリームを使用してマップを作成するときに重複を無視する
Map&lt;String, String&gt; phoneBook = people.stream() .collect(toMap(Person::getName, Person::getAddress)); java.lang.IllegalStateException: Duplicate key重複する要素が見つかったときに取得します。 マップに値を追加する際に、このような例外を無視することは可能ですか? 重複がある場合は、重複するキーを無視して続行する必要があります。
257 java  java-8  java-stream 

3
Iterable <T>がstream()およびparallelStream()メソッドを提供しないのはなぜですか?
Iterableインターフェイスがstream()and parallelStream()メソッドを提供しないのはなぜですか。次のクラスについて考えてみます。 public class Hand implements Iterable&lt;Card&gt; { private final List&lt;Card&gt; list = new ArrayList&lt;&gt;(); private final int capacity; //... @Override public Iterator&lt;Card&gt; iterator() { return list.iterator(); } } トレーディングカードゲームのプレイ中にカードを手にできるので、これはハンドの実装です。 基本的にはをラップしList&lt;Card&gt;、最大容量を確保し、その他の便利な機能をいくつか提供します。として直接実装するよりも優れていList&lt;Card&gt;ます。 さて、便宜上、を実装した方がいいと思ったのでIterable&lt;Card&gt;、ループを拡張したい場合は拡張forループを使用できます。(私のHandクラスもget(int index)メソッドを提供しているため、Iterable&lt;Card&gt;私の意見では正当化されます。) Iterableインターフェースは、(Javadocを除外)以下を提供します: public interface Iterable&lt;T&gt; { Iterator&lt;T&gt; iterator(); default void forEach(Consumer&lt;? super T&gt; action) { Objects.requireNonNull(action); for (T …

3
Java 8ラムダ、Function.identity()またはt-> t
OverаэтотвопросестьответынаStack Overflowнарусском:JavaямбдывJava 8、чтолучшеиспользовать-Function.identity()илиt-&gt; t? Function.identity()メソッドの使い方について質問があります。 次のコードを想像してみてください: Arrays.asList("a", "b", "c") .stream() .map(Function.identity()) // &lt;- This, .map(str -&gt; str) // &lt;- is the same as this. .collect(Collectors.toMap( Function.identity(), // &lt;-- And this, str -&gt; str)); // &lt;-- is the same as this. Function.identity()代わりにstr-&gt;str(またはその逆に)使用する理由はありますか?2番目のオプションの方が読みやすいと思います(もちろん、好みの問題です)。しかし、人が好まれるべき「本当の」理由はありますか?

12
Stream :: flatMapでのJava 8のオプションの使用
新しいJava 8ストリームフレームワークとその仲間は、非常に簡潔なJavaコードを作成しますが、簡潔に行うのが難しい一見シンプルな状況に遭遇しました。 List&lt;Thing&gt; thingsとメソッドを検討してくださいOptional&lt;Other&gt; resolve(Thing thing)。ThingsをOptional&lt;Other&gt;s にマップして、最初のを取得しOtherます。明白な解決策はを使用することですが、ストリームを返す必要things.stream().flatMap(this::resolve).findFirst()がflatMapありOptional、stream()メソッドがない(またはCollectionそれをに変換するか、それをとして表示するメソッドを提供するCollection) 私が思いつくことができる最高のものはこれです: things.stream() .map(this::resolve) .filter(Optional::isPresent) .map(Optional::get) .findFirst(); しかし、それは非常に一般的なケースのように思えるので、ひどく長い時間のように思えます。誰かがより良いアイデアを持っていますか?

5
Java Streamsが一度オフになるのはなぜですか?
C#とは異なりIEnumerable、実行パイプラインは何度でも実行できますが、Javaではストリームを1回だけ「反復」できます。 端末操作を呼び出すと、ストリームが閉じて使用できなくなります。この「機能」は多くの力を奪います。 これの理由は技術的ではないと思います。この奇妙な制限の背後にある設計上の考慮事項は何でしたか? 編集:私が話していることを示すために、C#でのQuick-Sortの次の実装を検討してください。 IEnumerable&lt;int&gt; QuickSort(IEnumerable&lt;int&gt; ints) { if (!ints.Any()) { return Enumerable.Empty&lt;int&gt;(); } int pivot = ints.First(); IEnumerable&lt;int&gt; lt = ints.Where(i =&gt; i &lt; pivot); IEnumerable&lt;int&gt; gt = ints.Where(i =&gt; i &gt; pivot); return QuickSort(lt).Concat(new int[] { pivot }).Concat(QuickSort(gt)); } 確かに、これがクイックソートの適切な実装であることを私は主張していません。ただし、これは、ラムダ式とストリーム操作を組み合わせた表現力の優れた例です。 そして、それはJavaではできません!ストリームを使用不可にすることなく、ストリームが空かどうかを確認することもできません。

4
Java 8ストリーム:複数のフィルターと複雑な条件
Stream複数の条件でaをフィルタリングしたい場合があります。 myList.stream().filter(x -&gt; x.size() &gt; 10).filter(x -&gt; x.isCool()) ... または、複雑な条件と単一の 条件で同じことを行うことができますfilter: myList.stream().filter(x -&gt; x.size() &gt; 10 &amp;&amp; x -&gt; x.isCool()) ... 2つ目のアプローチの方がパフォーマンス特性は優れていると思いますが、それはわかりません。 最初のアプローチは読みやすさで勝ちますが、パフォーマンスのために何が良いですか?

19
Javaストリームを1つだけの要素にフィルターする
Java 8を使用Streamしての要素を検索しようとしていますLinkedList。ただし、フィルター条件に一致するのは1つだけであることを保証したいと思います。 このコードを取ります: public static void main(String[] args) { LinkedList&lt;User&gt; users = new LinkedList&lt;&gt;(); users.add(new User(1, "User1")); users.add(new User(2, "User2")); users.add(new User(3, "User3")); User match = users.stream().filter((user) -&gt; user.getId() == 1).findAny().get(); System.out.println(match.toString()); } static class User { @Override public String toString() { return id + " - " + username; …

5
Java 8ストリームの.min()および.max():なぜこれがコンパイルされるのですか?
注:この質問は、以前のSOの質問であったデッドリンクに由来しますが、ここに行きます... このコードを参照してください(注:このコードは「機能しない」Integer::compareため、使用する必要があります-リンクされている質問から抽出しただけです)。 final ArrayList &lt;Integer&gt; list = IntStream.rangeClosed(1, 20).boxed().collect(Collectors.toList()); System.out.println(list.stream().max(Integer::max).get()); System.out.println(list.stream().min(Integer::min).get()); ののjavadocによる.min()と.max()、両方の引数がなければなりませんComparator。ただし、ここではメソッド参照はIntegerクラスの静的メソッドを参照しています。 では、なぜこれがまったくコンパイルされるのでしょうか?
215 java  java-8  java-stream 

9
Java8:Stream / Map-Reduce / Collectorを使用してHashMap <X、Y>からHashMap <X、Z>へ
単純なJava ListをY-&gt; から「変換」する方法を知っていますZ。つまり、 List&lt;String&gt; x; List&lt;Integer&gt; y = x.stream() .map(s -&gt; Integer.parseInt(s)) .collect(Collectors.toList()); 今、私はマップと基本的に同じことをしたいと思います、すなわち: INPUT: { "key1" -&gt; "41", // "41" and "42" "key2" -&gt; "42 // are Strings } OUTPUT: { "key1" -&gt; 41, // 41 and 42 "key2" -&gt; 42 // are Integers } ソリューションはString-&gt;に限定されるべきではありませんInteger。List上記の例のように、任意のメソッド(またはコンストラクター)を呼び出します。

13
Java 8を使用してオブジェクトのリストをtoString()メソッドから取得した文字列に変換する
Java 8には多くの便利な新機能があります。たとえば、オブジェクトのリストに対してストリームを反復処理して、Objectのインスタンスの特定のフィールドの値を合計できます。例えば public class AClass { private int value; public int getValue() { return value; } } Integer sum = list.stream().mapToInt(AClass::getValue).sum(); したがって、インスタンスからのメソッドStringの出力をtoString()1行で連結するを構築する方法があるかどうかを尋ねています。 List&lt;Integer&gt; list = ... String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class その仮定listの整数を含む1、2と3私は期待して、concatenatedあります"123"か"1,2,3"。

4
Java 8ストリームと配列の操作
新しいJava 8ストリーム機能を発見しました。Pythonから来て、2つの配列を「1行のpythonic」のように乗算する、合計のような配列の操作を実行するためのきちんとした方法があるかどうか疑問に思いました。 ありがとう

8
Java 8-リストを変換する最良の方法:マップまたはforeach?
私は、リスト持ってmyListToParse、私は要素をフィルタリングし、各要素に対してメソッドを適用して、別のリストに結果を追加したいですmyFinalList。 Java 8では、2つの方法で実行できることに気付きました。それらの間のより効率的な方法を知り、なぜ一方が他方よりも優れているのかを理解したいと思います。 私は、第三の方法についての提案をお待ちしています。 方法1: myFinalList = new ArrayList&lt;&gt;(); myListToParse.stream() .filter(elt -&gt; elt != null) .forEach(elt -&gt; myFinalList.add(doSomething(elt))); 方法2: myFinalList = myListToParse.stream() .filter(elt -&gt; elt != null) .map(elt -&gt; doSomething(elt)) .collect(Collectors.toList());
188 java  java-8  java-stream 

19
述語でストリームを制限する
Stream最初の要素が述語と一致しないまで(潜在的に無限)を制限するJava 8ストリーム操作はありますか? Java 9 takeWhileでは、以下の例のように使用して、10未満のすべての数値を出力できます。 IntStream .iterate(1, n -&gt; n + 1) .takeWhile(n -&gt; n &lt; 10) .forEach(System.out::println); Java 8にはそのような操作がないので、一般的な方法でそれを実装する最良の方法は何ですか?
187 java  java-8  java-stream 

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