LoginSignup
1
0

More than 1 year has passed since last update.

【まるで関数型】JavaのFunctionクラス入門

Posted at

Functionクラスとは?

Functionクラスはメソッドをインスタンスとして扱えるもので、引数などにも代入する事が可能です。

この記事について

  1. 細かいJavaの文法等は扱いません。
  2. 対象者:Java初学者
  3. ちょいむずかもしれない。

使用例

使用例の一つとしてFunctionクラスを引数で取るメソッドを考えてみましょう。

例えば以下のようなメソッドがあったとして、

Main.java
private static class Explanation {
        /**
         * 文字列を成形するメソッド
         */
        public static String formatter(String arg) {
            return arg + "!";
        }
}

こんなメソッドを引数に取るメソッドを書きた〜い!と思った時、
皆様はどのようにしてコードを書きますでしょうか。
(こんなメソッドを引数に取るメソッド例↓)

Main.java
private static class Explanation {
        /**
         * 文字列を成形するメソッドを引数に取るメソッド
         */
        public static String function1(??? formatter, String arg) {
            return formatter(arg);
        }
}

一般的な解決策としては「継承」などが挙がるかと思いますが、正直少し重い。。。
(処理の分割はここでは考えないものとする。)

そんな時便利なのがこのFunctionクラスです!!
早速Functionクラスを使用して上記の悩みを解消してみましょう。

まずはFunctionクラスとして関数を生成します。
Function<T,R>のTが引数の型で、Rには戻値の型を記述します。
また、処理を実行する際は.applyメソッドを使用します。
下記の例で行くとformatter.apply(String);

Main.java
public class Main {
    public static void main(String[] args) {
        // 文字列末尾に「!」を追加する関数(前述のformatterメソッドと同等)
        Function<String, String> formatter = arg -> arg + "!";
    }
}

そしたら生成したFunctionの型を引数に取る関数を作成してみましょう。

Main.java
/**
 * Name:
 *      function1
 *
 * Function:
 *      フラグが真だった場合文字列を指定のフォーマットで返却する。
 *
 * @param formatter 文字列を成形する関数
 * @param string    成形される文字列
 * @param flag      処理実行フラグ
 * @return          フラグに応じた処理結果
 */
 public static Optional<String> function1(Function<String, String> formatter, 
                                          String string, 
                                          boolean flag) {
     if (flag) {
         String txt = formatter.apply(string);
         return Optional.of(txt);
     }
     return Optional.empty();
 }

お望みのメソッドが作れましたので実行してみましょう。

java.Main.java
public class Main {
    public static void main(String[] args) {

        // 文字列末尾に「!」を追加する。
        Function<String, String> formatter = arg -> arg + "!";
        Optional<String> rs = function1(formatter, "Pricam", true);

        // 実行結果が存在する場合出力する。
        rs.ifPresent(System.out::println); //Pricam!
    }
}

無事出力する事が出来ましたね。

まとめ

今回はFunctionクラスを使用しました!
正直大人数の開発でこのような小難しい事はしない方が良いですが、
後学の為に是非個人開発等で使用してみてください♪

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0