• ベストアンサー

Stream#reduceの第3引数について

Stream#reduce Stream#collect の第3引数「combiner」が何のためにあるのか分かりません。パラレルストリームで第3引数を入れても入れなくても実行時間に差はありませんでした。Javaの参考書には「部分的な途中の集約結果を用いて、第3引数で指定された処理を行います」と書いてありますが、サンプルコードでは「combiner」を入れても入れなくても処理結果が変わらないので「combiner」を有効活用する例が分かりません。ネットで検索しても分かりませんでした。

  • Java
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • HNEX
  • ベストアンサー率62% (43/69)
回答No.1

なるほどこれは、パラレルストリームで影響が出るもののようですね 実行時間差ではなく結果に影響が出ますね 1~6までを単純に足し込む式を下記のように作りましたがcombinerの有無で結果が違いました 有り:21 正解 無し:45 不正解 public void test() { List<Integer> list = Arrays.asList(1,2,3,4,5); int identity = 6; System.out.println(list.stream().parallel().reduce(identity, (x, y) -> x + y, (x, y) -> x + y - identity)); System.out.println(list.stream().parallel().reduce(identity, (x, y) -> x + y)); } combinerの式が「x + y - identity」となっているのはjavadocにある 「すべてのuについて、combiner(identity, u)がuに等しくなります」 「combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)」 を成立させるためです 参考URLですごく詳しく説明しているので、是非ご確認ください

参考URL:
https://qiita.com/frost_star/items/a36e66dff419e7c07151

関連するQ&A

  • 引数について質問

    私プログラミング初心者ですので、できるだけ優しい解説をしていただければ幸いです! 引数について、以下のような解説がありました。 「引数には仮引数と実引数の2種類が存在する。仮引数は、関数を定義する際に変数で指定する引数である。また、実引数は、プログラムの実行時に関数に引き渡される値となる引数である。つまり、関数の実行時には、実引数の値が仮引数に代入されることになる。」 質問:1「関数を定義する際に変数で指定する引数である。」という記述の中で「関数を定義」とありますが、実際のソースコードにおいて何に対応するかわかりません。簡潔なソースコードを交えて解説していただければ幸いです。 質問2:「関数を定義」に限らず、プログラミングにおいて「定義」という言葉をよく見ますが、これは本質的にどういう意味をもっているのでしょうか?具体的なソースコースコードを交えて解説してくださると幸いです。 もしかして、その定義とは例えば「public static void main(String arg[]){」のような「メソッド宣言」のことですか? 質問3:「関数の実行時には、実引数の値が仮引数に代入されることになる。」と書いてありますが、 これはどういうことですか、僕が実際にソースコードで記述してみるので、その考えが正しいか判定してください package 第4章; public class A { public static void main(String arg[]){ double x; x=Math.sqrt(2.0); System.out.println("2.0の平方根は"+x); } } 僕の考え:String arg[]が仮引数で、実引数2.0がString arg[]に代入されるってことでしょうか? 「定義」といえば、上記のソースコードでは、public static void main(String arg[]){ 以外見当たらないので、、 僕の考え2:Mathクラスは、標準クラス(javaが最初から備えているクラス)だから、プログラマが「関数を定義」しなくても予め関数が定義されているから、関数を定義する必要がない、ということでしょうか?

    • ベストアンサー
    • Java
  • Fortran "実引数の型が仮引数の型と異なります。"

    Fortran "実引数の型が仮引数の型と異なります。" Intel Visual Fortranの最新版をMS Visual Studio 2008で使用(お試し)しています。 既存のFortranプログラムでエラーが出て、使えなくなりました。 問題点を要約すると以下のようなシンプルなコードに集約されました。 ---------------------- 00 program main 01 call sub1(10.d0) 02 call sub1(10.0) 03 end ! ---------------------- 04 subroutine sub1(rr) 05 real*8 rr 06 write(*,*) 'rr = ', rr 07 end subroutine ! --------------------- 昔のFortranでは、Subをcallする時に、仮引数の型と厳密に一致していなくても、うまく処理してくれたと思います。(倍精度でも整数でも、同じ数値とみなして) オプションのルーチンインターフェースのチェック(/warn:interfaces)をオフにすると、コンパイルは出来るようになるのですが、上記プログラムの計算結果は、01行と02行で結果が異なってきます。 (02行はおかしな値が入る) 本来、ランタイムエラー防止の観点からは、このような厳密性を要求するのは良いことだと思いますが、既存のプログラムが実行できなくなるのは痛手なので、何かオプションの変更で対応出来ないものでしょうか? よろしくお願いいたします。

  • URLを引数として別のプログラム(クラス)を呼び出して実行させたい

    いつもお世話になっております。 以前の質問の http://oshiete1.goo.ne.jp/kotaeru.php3?q=1725502 No4のご回答にて教えていただいたプログラムを、 別のプログラムから入力したURLを引数にして呼び出して、 プログラムを実行させるにはどのようにすればいいでしょうか? 例えば、以下のプログラムのように、 url1を引数にして、GetTBAddrYAHOOクラスの処理をさせ、 結果として取得したURLを返して出力させたいです。 public class Sample { public static void main(String[]args){ String url1 = args[0]; if(url1.matches(".*(blogs\\.yahoo\\.co\\.jp).*")){ url1を引数にしてclass GetTBAddrYAHOO の処理を行い、 トラックバックされているアドレスを取得して、 その結果を返して出力 } そのためにはSampleとGetTBAddrYAHOOのプログラムをどのように改正させればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • PHP シェルスクリプト 引数

    失礼します。現在PHPからシェルスクリプトを引数を付けて実行し、戻り値で確認が出来るか試しているのですがなかなか参考になる記事がなく実現が出来ない状態です 調べたところ、 phpからhoge.shというシェルファイルをargという引数で実行したいとします。 引数を"'. .'"で囲う事で、引数を渡せるようです。 $output = shell_exec('/bin/sh /path/to/hoge.sh "'.$arg.'"') var_dump($output) 上記のような記事を見つけたのですがhoge.shはどのように$argを受け取り、戻り値を渡しているのでしょうか?また、$argの値の中身は渡す引数の内容という認識で正しいのでしょうか?サンプルコードなどがあるとうれしいです。 ご教授よろしくお願い致します。

  • オブジェクトの中で呼び出される順番とデフォ引数?

    ・意味が分からないコードがあるので教えてください ■コード var arg; var obj = {  hoge : function( arg ) {   var hoge = function(arg){    return function() {    }   }(arg);   hoge();  } } ■質問 ・この時、obj.hoge(arg);と書いたら、どういう処理が走るのでしょうか? ・初めに実行されるのは? 無名関数部分? それともhoge()? ・hoge()を実行する際、引数指定していないので、引数は渡らない?

  • アプレットにパラメータを渡す方法

    Javaのアプレットにパラメータを渡し、Javaアプレットでその引数を受け取る具体的なコードが知りたいのですが、何かよいサンプルはありますか?

    • ベストアンサー
    • Java
  • PHP stream_context_creat

    今日は、 境内のメソッドについて質問があります。 以下のスクリプトについてですが、 <?php //POSTする送信データ $postData = array ( "key_01" => "POST送信データ01&", "key_02" => "POST送信データ02&", ); //送信するデータをURLエンコードする $postData = http_build_query($postData); $header = array( "http" => array( //(1) "method" => "POST", //(2) "header" => "Content-type: application/x-www-form-urlencoded\r\nuser_name: testuser_name", //(3) "content" => $postData //(4) ) ); //上記headerという変数からHTTPリクエストのストリームを作成する $request = stream_context_create($header); $res = file_get_contents("http://localhost/stream02.php",false,$request); print $res; 上記のようなスクリプにおける、ストリームというのはいわゆるクライアント側から サーバー側へ送信するHTTPリクエストと同義のものでしょうか? であればHTTPレスポンスのようにそのヘッダーの中身を取得する getallheaders()というような感じで、実際に、送信されるHTTPリクエストの 中身を視認したいのですが可能でしょうか? 以下サイトの http://www.tohoho-web.com/ex/http.htm HTTPサンプルのように取得したいのですが・・・。 また、冒頭に記述したスクリプトですが php.iniのallow_url_fopenの箇所がonになっていないと実行できないことは 確認したのですが、もし仮にallow_url_fopenがOffになっていた場合、 上記のようにストリームと呼ばれるものを使ってHTMLフォーム以外でPOSTリクエスト したい場合は何か方法があるのでしょうか? 通常であればPEARのHTTP_Requestとかで処理するかと存じますが、 PHPの組み込み関数のみでやる場合、他に方法ってありますか? 識者の方ご教授ください。

    • ベストアンサー
    • PHP
  • JAVAのエラーについて

    私はJAVAを始めたばかりの初心者です。 中間コードclassファイルを実行するとエラーが出てしまいます。 誰かエラーの取り方を教えていただけませんか? java sample.class で実行。 すると Exception in thread "main"java.lang.NoClassDefFoundError: sample/class となり実行結果が得られません。 私が気になる点があります。 コンパイラによって生成されたclassファイルが「不明なアプリケーション」となって開くことが出来ません。 これもエラーに関係してるのでしょうか?

  • 引数が無効です アクセス ADO AddNew

    アクセスのテーブルにアクセスVBAで値を追加しようとしてるのですが Set cn = CurrentProject.Connection rs.Open "SELECT * FROM TAccess", cn, adOpenStatic, adLockPessimistic rs.AddNew rs("主キー") = Me.txt_主キー.Value rs.Update を実行しようとすると、 rs.AddNewの部分で、「引数が無効です」と言うエラーが発生し、 一時的にVBAコードが止まります。 しかしそのままF5で処理を実行すると、問題なくコードが動き、データが追加されます。 でもかならずrs.AddNewでエラーが発生します。 エラーが発生するのにそのまま実行すると問題ないのはなぜでしょうか? 「引数が無効です」は、どういう意味のエラーなのでしょうか?

  • eclipseで別サンプルを起動するには

    Java初心者です。 いま、eclipseでアンドロイド向けのアプリを作るために、 練習しています。(始めたばかりです。) そのときに、簡単なサンプルを複数作り、それの挙動を確かめたいのですが、 実行されるのは最初に作成したjavaファイルしか実行されません。 例えば、最初のプロジェクト作成時にパッケージxxx.yyyとして、Sample1.javaを作ったとします。 当然、この段階で実行すれば、Sample1が実行されます。 次に別パッケージにxxx.zzzを作成し、Sample2.javaを作り、実行したとしても、 実行結果にはSample1.javaの結果しかうつりません。 解決法としては、新しくプロジェクトを立ち上げ、その中にSample2.javaを作る方法があると思うのですが、 これだと見た目が煩雑になりますし、サンプルを作るたびに時間がかかり、あまりしたくありません。 他にいい方法などがありましたら、ご教授ください。よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう