[解決済み] java 8で型変換を行うreduceメソッドにcombinerが必要な理由
質問
が果たす役割を十分に理解することができず、困っています。
combiner
ストリームで果たす役割
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つの中間蓄積intを加算しています。
しかし、なぜ最初の例がコンバイナーなしでコンパイルできないのか、また、コンバイナーは2つのintを足し合わせているだけなので、stringからintへの変換をどのように解決しているのか理解できません。
どなたか教えてください。
解決方法は?
の2引数バージョンと3引数バージョンは
reduce
には同じ型を受け付けません。
accumulator
.
2つの引数
reduce
は
と定義されています。
:
T reduce(T identity,
BinaryOperator<T> accumulator)
あなたの場合、TはStringなので
BinaryOperator<T>
は2つのString引数を受け取り、Stringを返すはずです。しかし、あなたはintとStringを渡したので、コンパイルエラーが発生しました。
argument mismatch; int cannot be converted to java.lang.String
. 実は、ID値として0を渡すのも間違っていると思います。
また、このバージョンのreduceはTsのストリームを処理してTを返すので、Stringのストリームをintにリデュースするのには使えないことに注意してください。
3つの引数
reduce
は
と定義されています。
:
<U> U reduce(U identity,
BiFunction<U,? super T,U> accumulator,
BinaryOperator<U> combiner)
あなたの場合、UはInteger、TはStringなので、このメソッドはStringのストリームをIntegerに縮小します。
については
BiFunction<U,? super T,U>
アキュムレータは、2つの異なる型(U と ? super T)のパラメータを渡すことができ、あなたの場合は、Integer と String です。また、ID値Uは、あなたの場合、Integerを受け取りますので、0を渡しても問題ありません。
あなたが望むことを実現するもう1つの方法.
int length = asList("str1", "str2").stream().mapToInt (s -> s.length())
.reduce(0, (accumulatedInt, len) -> accumulatedInt + len);
ここでは、ストリームの型は
reduce
の2パラメータ版を使用することができます。
reduce
.
もちろん
reduce
を全く使わない。
int length = asList("str1", "str2").stream().mapToInt (s -> s.length())
.sum();
関連
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
javaで非静的な解を静的な参照にすることができない
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
自動配線された依存性のインジェクションに失敗しました。
-
スレッド "main" で例外発生 java.net.BindException: アドレスは既に使用中です。NET_Bind
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み] なぜJavaのmainメソッドは静的なのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
linux run jarfile Invalid or corrupt jarfile error.
-
org.glassfish.jersey.servlet.ServletContainer
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
ローカルリソースのロードが許可されていない場合の解決策