ホームページ >Java >&#&チュートリアル >Java8での述語の使い方の紹介(コード例)
この記事では、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) ;
述語とは何ですか?
boolean を返します) を filterApples に渡します。このメソッドは、Predicateパラメータを受け入れることを想定しています。 predicate
という単語は、パラメータ値を受け入れて true または false を返す関数のようなものを表すために数学でよく使用されます。
後で説明するように、Java 8 では Functionを書くこともできます。学校で関数を学んだことがあるが
predicates についてはよく知らない読者は、Predicateを使用することもできます。これはより標準的な方法であり、ブール値をブール値にカプセル化することを回避します。
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 + '}'; } } }
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 サイトの他の関連記事を参照してください。