ホームページ  >  記事  >  Java  >  Java8での述語の使い方の紹介(コード例)

Java8での述語の使い方の紹介(コード例)

不言
不言転載
2019-02-21 14:13:066559ブラウズ

この記事では、Java8 での述語の使用法 (コード例) を紹介します。必要な方は参考にしていただければ幸いです。

パスコード

まず、getColor メソッドを持つ Apple クラスと、Apple のリストを保持する変数インベントリがあると仮定します。 。すべての青リンゴを選択してリストを返したい場合があります。通常、私たちはこの概念を表現するためにフィルターという言葉を使います。 Java 8 より前では、filterGreenApples:

public static List<Apple> filterGreenApples(List<Apple> inventory){
List<Apple> result = new ArrayList<>();
for (Apple apple: inventory){
if ("green".equals(apple.getColor())) {
result.add(apple);
        }
    }
return result;
}

のようなメソッドを作成する可能性がありました。しかし、その後、誰かが 150 グラムを超えるような重いリンゴを選択する可能性があるため、重い心で次のメソッドを作成しました
メソッドコピー アンド ペーストを使用する場合でも:

public static List<Apple> filterHeavyApples(List<Apple> inventory){
List<Apple> result = new ArrayList<>();
for (Apple apple: inventory){
if (apple.getWeight() > 150) {
result.add(apple);
        }      
    }
return result;
}

ソフトウェア エンジニアリングにおけるコピー アンド ペーストの危険性は誰もが知っています。一方を更新および修正しても、もう一方は忘れてしまいます。 2 つのメソッドの違いは 1 行だけです。それは、if で強調表示されている条件行です。強調表示された 2 つの方法の違いが、受け入れられた
の重みの範囲のみである場合は、
(150, 1000) を指定すると重いリンゴ (150 グラム以上) が選択され、(0, 80) を指定すると軽いリンゴ (80 グラム未満) が選択されます。
ただし、前に述べたように、Java 8 では条件付きコードをパラメーターとして渡すため、フィルター メソッド
でのコードの重複を避けることができます。これで、次のように記述できます:

public static boolean isGreenApple(Apple apple) {
    return "green".equals(apple.getColor());
}
public static boolean isHeavyApple(Apple apple) {
    return apple.getWeight() > 150;
}
static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) {
    List<Apple> result = new ArrayList<>();
    for (Apple apple: inventory){
        if (p.test(apple)) {
            result.add(apple);
        }
    }
    return result;
}
これを使用するには、次のように記述できます:

filterApples(inventory, Apple::isGreenApple);
または
filterApples(inventory, Apple::isHeavyApple) ;
述語とは何ですか?

前のコードは、メソッド Apple::isGreenApple (パラメータ Apple を受け入れ、
boolean を返します) を filterApples に渡します。このメソッドは、Predicate パラメータを受け入れることを想定しています。 predicate
という単語は、パラメータ値を受け入れて true または false を返す関数のようなものを表すために数学でよく使用されます。
後で説明するように、Java 8 では Function を書くこともできます。学校で関数を学んだことがあるが
predicates についてはよく知らない読者は、Predicate を使用することもできます。これはより標準的な方法であり、ブール値をブール値にカプセル化することを回避します。

Lambdaにメソッドを渡す
メソッドを値として渡すのは当然便利ですが、isHeavyAppleやisGreenAppleのような1回か2回しか使えない短いメソッドだと定義を山ほど書くのが大変です少し面倒です。ただし、Java 8 ではこの問題も解決されています。新しい
表記法 (匿名関数または Lambda) が導入されており、

filterApples(inventory, (Apple a) -> "green".equals (a. getColor()) );
or
filterApples(inventory, (Apple a) -> a.getWeight() > 150 );
or Even
filterApples(inventory, (Apple a) -> a.getWeight() "brown".equals(a.getColor()) );
完全なコードは次のとおりです:

public class FilteringApples1 {
    public static void main(String[] args) {
        List<FilteringApples1.Apple> inventory = Arrays.asList(new FilteringApples1.Apple(80, "green"),
                new FilteringApples1.Apple(155, "green"),
                new FilteringApples1.Apple(120, "red"));

        List<FilteringApples1.Apple> greenApples2 = filterApples(inventory, (FilteringApples1.Apple a) -> "green".equals(a.getColor()));
        System.out.println(greenApples2);

        // [Apple{color='green', weight=155}]
        List<FilteringApples1.Apple> heavyApples2 = filterApples(inventory, (FilteringApples1.Apple a) -> a.getWeight() > 150);
        System.out.println(heavyApples2);

        // []
        List<FilteringApples1.Apple> weirdApples = filterApples(inventory, (FilteringApples1.Apple a) -> a.getWeight() < 80 ||
                "brown".equals(a.getColor()));
        System.out.println(weirdApples);
    }


    public static List<FilteringApples1.Apple> filterApples(List<FilteringApples1.Apple> inventory, Predicate<FilteringApples1.Apple> p) {
        List<FilteringApples1.Apple> result = new ArrayList<>();
        for (FilteringApples1.Apple apple : inventory) {
            if (p.test(apple)) {
                result.add(apple);
            }
        }
        return result;
    }

    public static class Apple {
        private int weight = 0;
        private String color = "";

        public Apple(int weight, String color) {
            this.weight = weight;
            this.color = color;
        }

        public Integer getWeight() {
            return weight;
        }

        public void setWeight(Integer weight) {
            this.weight = weight;
        }

        public String getColor() {
            return color;
        }

        public void setColor(String color) {
            this.color = color;
        }

        public String toString() {
            return "Apple{" +
                    "color='" + color + '\'' +
                    ", weight=" + weight +
                    '}';
        }
    }

}

組み込みの Java8 フィルター関数
static <T> Collection<T> filter(Collection<T> c, Predicate<T> p);
この方法では、filterApples を記述する必要さえありません。たとえば、前の呼び出し

filterApples(inventory, (Apple a) -> a.getWeight() > 150 );
はライブラリ メソッド filter:

filter(inventory, (Apple a) -> a.getWeight() > 150 );
## を直接呼び出すことができるためです。 #

以上がJava8での述語の使い方の紹介(コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。