過去質問が無かったので、ここに質問させてください。
メソッド参照と関数型インターフェースについて分からない部分があります。
【楽チンJava】メソッド参照での呼び出し方 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
https://www.sejuku.net/blog/22592
import java.util.function.IntSupplier;
public class Sample4 {
public static void main(String args[]) {
String str = "Hello";
IntSupplier is = str::length; // メソッド参照
System.out.println(is.getAsInt());
}
}
上記のコーディングの中で、
IntSupplier is = str::length; // メソッド参照
の部分があります。
これは関数型インターフェースIntSupplierにstr::lengthを入れていますが、
結果として"Hello"の文字数である5を出力する時、その計算はどこで行われているのかというのを知りたいのです。
IntSupplier is = str::length;
でstrのlengthを取得すると言う固有の関数型インターフェースIntSupplierを用意する
と言うところまでは想像がつくのですが、
上記のisに放り込まれた時点で、その計算を終えているのか、あるいは
is.getAsInt()でのis再登場時に計算されるのかを知りたいです。
このような質問をしているのは、関数型インターフェースへの理解が不足しているからだと私自身は考えています。
関数型インターフェースを用意し、そこにメソッド参照を用意してセットするのであれば、それはまだ値の入っていない(引数の指定されていない)計算のファンクションだという認識だったのですが、その関数を用意する時に、すでに(上記で言えば)引数に当たるstrを指定しているので、どこで計算をしているのだろうと気になった次第です。
どなたかお分かりになる方がいらっしゃいましたら教えてください。
No.1ベストアンサー
- 回答日時:
「実際にどこで計算するのか」はさておき概念的には getAsInt を呼び出したときにその中で計算する.
なるほど、is.getAsInt()の時ですね。
回答ありがとうございます。
その後調べていったら若干自己解決に近い形まで行ったので、同じ問題に引っかかった方はご参考までに下記をお読み頂ければと思います。
私はこの関数型インターフェース内で、IntSupplier is = str::lengthとあるなら、もう既にstr::lengthの値があってもいいんじゃないか? でもis.getAsInt()のところで何か挙動しているようにも思えるし・・・と疑問に思っていました。
関数型インターフェースは内部状態(State)を排除する思想があるようです。
オブジェクト宣言では、何らかのオブジェクトがインスタンス化された時には何らかの内部状態が保持されますが、関数型インターフェースはそれが意図的に排除されている思想だということです。
よって宣言時には内部状態(State)を保持しません。オブジェクトではなく、あくまで計算機構(関数)そのものを用意すると言う形のようです。
java8:関数型インターフェースの背景にある考え方 – サイゼントの技術ブログ
https://cyzennt.co.jp/blog/2019/09/14/java8%EF%B …
プログラミングで副作用と状態ってなに? | 民主主義に乾杯
https://python.ms/side-effect/
つまりはstr自体の中身は自明であるものの、str::lengthはその計算方式と計算結果の状態を内部に保持するのではなく、飽くまで計算方式の関数を宣言するものであるのだ、と言う理解で概ね正しそうです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正規表現について質問です。 カ...
-
Eclipse 動的プロジェクトで404...
-
配列にnullを代入すると、null...
-
プログラミングの問題です。大...
-
デバッグツールの具体例を教え...
-
質問です。 配列が100以上の場...
-
自作Androidアプリのデータ引き...
-
変数名とDBカラム名の関係性に...
-
一覧表示画面で正しくDBから取...
-
ゲーム開発の入門書を探しています
-
jdbcでinsert,delete,createをe...
-
session,requestはjspで未定義...
-
サーブレットをapacheで公開す...
-
下記のリストならno002が含まれ...
-
is this even a thing?
-
JAの支部?地域の農協のカード...
-
えハミルトン路と全域木のちが...
-
CSV出力を画面から選択したデー...
-
ショートカットキーについて
-
list の空は [] ってあわらすのに
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列にnullを代入すると、null...
-
プログラミングの問題です。大...
-
マイクラでPythonのプログラミ...
-
正規表現について質問です。 カ...
-
eclipseで作ったプログラムを他...
-
Eclipse 動的プロジェクトで404...
-
ゲーム開発の入門書を探しています
-
jdbcでinsert,delete,createをe...
-
jdk17.06のインストーラーが起...
-
ショートカットキーについて
-
「main メソッドを持つクラスが...
-
CSV出力を画面から選択したデー...
-
Processingでマウスクリックで...
-
list の空は [] ってあわらすのに
-
次のhtml・cssでspan内の文字を...
-
eclipse実行ができない
-
質問です。 配列が100以上の場...
-
デバッグツールの具体例を教え...
-
StringReaderのサンプルプログ...
-
JSFタグのfタグとは
おすすめ情報