2
4

More than 1 year has passed since last update.

Java 初心者でもわかる関数型インタフェイス(Predicate編)

Last updated at Posted at 2022-02-16

はじめに

関数型インターフェースの1つPredicatetインターフェースをご存知でしょうか。
predicateインターフェースとラムダ式を組み合わせれば、複雑な条件をシンプルに実装できてしまいます。そんなPredicateインターフェースとおまけにBiPredicateインターフェースを解説していきます。

Predicatetとは?

Predicateを日本語に訳すと「断定する」という意味になります。言葉の通り、引数を通して何らかの判断をする処理を定義するためのものです。例えば、戻り値がboolean型の処理をラムダ式で変数に代入して簡単に呼び出せるようにできます。Predicateはtestメソッドを持っています。そのメソッドは引数を1つ受け取り、その引数を使って、その結果をboolean型で戻します。サンプルコードを通して使い方を説明していきます。

どうやって使うの?

サンプルコードでは理想の男性を絞るためにMainクラスでif文を使って絞り込んでいきます。

Man.java
public class Man {
    private int hight;
    private int income;
    private String looks;
    private int age;

    public Man(int hight, int income, String looks, int age) {
        this.hight = hight;
        this.income = income;
        this.looks = looks;
        this.age = age;
    }
    public int getHight() {
        return hight;
    }
    public int getIncome() {
        return income;
    }
    public String getLooks() {
        return looks;
    }
    public int getAge() {
        return age;
    }
}

普通にif文を使用すると複雑な文になってしまいます。

Main.java
Man man = new Man(170,900,"hot",20);
if(getHight > 170 && getIncome > 800||
   getLooks == hot && age <30){
}

それを解消するためにPredicateインターフェースを利用します。
下記のコードはPredicateオブジェクトを組み合わせた論理演算を実行しています。

Main.java
import java.util.function.Predicate;

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

     Predicate<Man> isHight = m -> m.getHight() > 170;
     Predicate<Man> isIncome = m -> m.getIncome()<1000;
     Predicate<Man> isLooks = m -> m.getLooks()=="hot" ;
     Predicate<Man> isAge = m ->m.getAge()<35;
     Predicate<Man> type = isHight.and(isIncome).or(isLooks.and(isAge));
     Man man = new Man(170,900,"hot",20);
    if(type.test(man)) {
        System.out.println("OK");
    }else {
        System.out.println("NG");
    }
  }
}

BiPredicateとは?

Predicateは引数を1つ受け取るのに対してBiPredicateは2つの引数を受け取って何らかの判断をする処理を記述します。Predicateメソッドを同じくtestメソッドを持ちます。

どのように使うの?

サンプルコードを通して説明していきます。
下記のコードはBiPredicateは2つのString型を受け取り、変数strがsuffixで終わっているかをendsWithを利用して判定しています。

Sample.java
import java.util.function.BiPredicate;

public class Sample {
    public static void main(String[] args) {
        BiPredicate<String, String> b=
                (str, suffix) -> str.endsWith(suffix);
        System.out.println(b.test("sample.class", ".class"));
    }
}

まとめ

Predicateは1つの引数を通して何らかの判断をする処理を定義するためのものです
BiPredicateは2つの引数を受け取って何らかの判断をする処理を記述します

2
4
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
2
4