ハマっている「お菓子」を教えて!

過去質問が無かったので、ここに質問させてください。

メソッド参照と関数型インターフェースについて分からない部分があります。

【楽チン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を指定しているので、どこで計算をしているのだろうと気になった次第です。

どなたかお分かりになる方がいらっしゃいましたら教えてください。

A 回答 (2件)

「実際にどこで計算するのか」はさておき概念的には getAsInt を呼び出したときにその中で計算する.

    • good
    • 0
この回答へのお礼

なるほど、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はその計算方式と計算結果の状態を内部に保持するのではなく、飽くまで計算方式の関数を宣言するものであるのだ、と言う理解で概ね正しそうです。

お礼日時:2020/11/03 22:49

関数型インターフェースは呼び出すだけのオブジェクトであるため、


実際に計算が行われるのは is から get 等の呼び出しを行った後です。

// IntSupplier is = str::length; と同等の処理
IntSupplier is = new IntSupplier() {
_ public int getAsInt(){ return str.length(); }
};
    • good
    • 1
この回答へのお礼

回答ありがとうございます! 
助かりました。
ベストアンサーをつけられず申し訳ありません。

お礼日時:2020/11/03 22:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!