社会人のメモ帳

忘れたくないことアレコレ

【第2週】関数型インタフェースの定義と記述を対策する【Java Gold合格へ向けて】

PREV | LIST | NEXT

関数型インタフェースの定義と記述を対策する

黒本の第2章は『関数型インタフェースとラムダ式』、この中にある関数型インタフェースの定義と記述について対策を進めていく。とりあえずは下記の6つに関して、コードと共に理解していく。

インタフェース 英語の意味 戻り値型 メソッド
Supplier 提供者 get()
Consumer 消費者 void accept(T)
Predicate 断定する boolean test(T)
Function<T, R> 関数 R apply(T)
UnaryOperator 単項演算子 apply(T)
BinaryOperator 二項演算子 apply(T, T)

Supplier

Supplier(=提供者)という言葉が意味する通り、指定されたデータを提供するインタフェースである。ポイントは下記の2点。 1. 引数はなし(=void) 2. メソッドはget

public class Main {
    public static void main(String[] args) {
        Supplier<String> s = () -> "test";
        System.out.println(s.get());
    }
}

実行結果

test

Consumer

Consumer(=消費者)という言葉が意味する通り、渡されたデータを消費するインタフェースである。ポイントは下記の2点。 1. 戻り値はなし(=void) 2. メソッドはaccept

public class Main {
    public static void main(String[] args) {
        Consumer<String> s = (str) -> System.out.println(str);
        s.accept("test");
    }
}

実行結果

test

Predicate

Predicate(=断定する)という言葉が意味する通り、渡されたデータが条件に合致するか断定するインタフェースである。ポイントは下記の2点。 1. 戻り値は判定結果(=boolean) 2. 実行メソッドはtest 3. and / or メソッドで複合条件の断定処理を実装可能

public class Main {
    public static void main(String[] args) {
        Predicate<Integer> s = (num) -> num==2;
        System.out.println(s.test(1));
        System.out.println(s.test(2));
        System.out.println(s.test(3));
    }
}

実行結果

false true false

andメソッドを利用することで下記のように複数の条件を組み合わせて判定することができる。

public class Main {
    public static void main(String[] args) {
        Predicate<Integer> t = (num) -> num>0;
        Predicate<Integer> u = (num) -> num<=10;
        // (0 < 9 <= 10) is TRUE
        System.out.println(t.and(u).test(9));
        // (0 < 10 <= 10) is TRUE
        System.out.println(t.and(u).test(10));
        // (0 < 11 <= 10) is FALSE
        System.out.println(t.and(u).test(11));
    }
}

実行結果

ture true false

orメソッドも利用することで下記のように複数の条件を組み合わせて判定することができる。

public class Main {
    public static void main(String[] args) {
        Predicate<Integer> t = (num) -> num>0;
        Predicate<Integer> u = (num) -> num<=10;
        // (0 < 9) OR (9 <= 10) is TRUE
        System.out.println(t.or(u).test(9));
        // (0 < 10) OR (10 <= 10) is TRUE
        System.out.println(t.or(u).test(10));
        // (0 < 11) OR (11 <= 10) is TRUE
        System.out.println(t.or(u).test(11));
    }
}

実行結果

ture true false

Function

Function(=関数)という言葉が意味する通り、インタフェースである。ポイントは下記の2点。 1. 引数と戻り値を指定する 2. メソッドはapply

public class Main {
    public static void main(String[] args) {
        Function<Integer, String> s = (num) -> "これは" + num + "です";
        System.out.println(s.apply(1));
        System.out.println(s.apply(2));
    }
}

実行結果

これは1です これは2です

UnaryOperator

UnaryOperator(=単項演算子という言葉が意味する通り、一つの項を用いて一つの結果を得るインタフェースである。ポイントは下記の2点。 1. 引数と戻り値が同じ型 2. メソッドはapply

public class Main {
    public static void main(String[] args) {
        UnaryOperator<Integer> s = (num) -> num*num;
        System.out.println(s.apply(1));
        System.out.println(s.apply(2));
    }
}

実行結果

1 4

BinaryOperator

BinaryOperator(=二項演算子という言葉が意味する通り、二つの項を用いて一つの結果を得るインタフェースである。ポイントは下記の2点。 1. 引数と戻り値が同じ型 2. メソッドはapply

public class Main {
    public static void main(String[] args) {
        BinaryOperator<Integer> s = (num1, num2) -> num1*num2;
        System.out.println(s.apply(1,2));
        System.out.println(s.apply(2,3));
    }
}

実行結果

2 6

まとめ

FunctionとUnaryOperatorとBinaryOperatorは『戻り値と引数の関係性が違う』だけで、実施メソッドは同じapplyである。

  • UnaryOperatorは一つの引数で一つの結果を得られ、BinaryOperatorは二つの引数で一つの結果を得られる。また引数と戻り値の型は同じ。
  • ただしFunctionは一つの引数で一つの結果を得られ、引数と戻り値の型が同じとは限らない。
PREV | LIST | NEXT