<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java 謂詞示例 – 謂詞過濾器 > 原文: [https://howtodoinjava.com/java8/how-to-use-predicate-in-java-8/](https://howtodoinjava.com/java8/how-to-use-predicate-in-java-8/) 在數學中,**謂詞**通常被理解為**布爾值函數**`'P: X? {true, false}'`,稱為`X`謂詞。 可以將其視為返回`true`或`false`值的運算符或函數。 ## Java 8 謂詞用法 在 Java 8 中,[謂詞](https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html)是[函數式接口](https://howtodoinjava.com/java8/functional-interface-tutorial/),因此可以用作 [**lambda 表達式**](//howtodoinjava.com/java8/complete-lambda-expressions-tutorial-in-java/ "Complete lambda expressions tutorial") 或方法參考的分配目標。 那么,您認為如何,我們可以在日常編程中使用這些`true`/`false`返回函數? 我會說,您可以在需要求值類似對象的組/集合上的條件的任何地方使用謂詞,以便求值可以得出`true`或`false`。 例如,您可以在這些**實時用例**中使用謂詞: 1. 查找在特定日期之后出生的所有孩子 2. 特定時間定下的披薩 3. 超過一定年齡的員工等 #### Java 謂詞類 因此, **java 謂詞**似乎很有趣。 讓我們更深入。 如我所說,`Predicate`是**函數式接口**。 這意味著我們可以在需要謂詞的任何地方傳遞 lambda 表達式。 例如,一種這樣的方法是來自[**流**](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html)接口的`filter()`方法。 ```java /** * Returns a stream consisting of the elements of this stream that match * the given predicate. * * <p>This is an <a href="package-summary.html#StreamOps">intermediate * operation</a>. * * @param predicate a non-interfering stateless predicate to apply to each element to determine if it * should be included in the new returned stream. * @return the new stream */ Stream<T> filter(Predicate<? super T> predicate); ``` 我們可以將流假定為一種機制,以創建支持順序和并行聚合操作的元素序列。 這意味著我們可以隨時通過一次調用收集并執行流中存在的所有元素的某些操作。 因此,從本質上講,我們可以使用流和謂詞來: * 首先從組中過濾某些元素,然后 * 然后對過濾后的元素執行一些操作。 ## 在集合上使用謂詞 為了演示,我們有一個`Employee`類,如下所示: ```java package predicateExample; public class Employee { public Employee(Integer id, Integer age, String gender, String fName, String lName){ this.id = id; this.age = age; this.gender = gender; this.firstName = fName; this.lastName = lName; } private Integer id; private Integer age; private String gender; private String firstName; private String lastName; //Please generate Getter and Setters //To change body of generated methods, choose Tools | Templates. @Override public String toString() { return this.id.toString()+" - "+this.age.toString(); } } ``` #### 1\. 所有年齡在 21 歲以上的男性員工 ```java public static Predicate<Employee> isAdultMale() { return p -> p.getAge() > 21 && p.getGender().equalsIgnoreCase("M"); } ``` #### 2\. 所有年齡在 18 歲以上的女性員工 ```java public static Predicate<Employee> isAdultFemale() { return p -> p.getAge() > 18 && p.getGender().equalsIgnoreCase("F"); } ``` #### 3\. 所有年齡超過給定年齡的員工 ```java public static Predicate<Employee> isAgeMoreThan(Integer age) { return p -> p.getAge() > age; } ``` 您可以在需要時構建更多它們。 到目前為止,一切都很好。 到目前為止,我已經在`EmployeePredicates.java`中包括了上述 3 種方法: ```java package predicateExample; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; public class EmployeePredicates { public static Predicate<Employee> isAdultMale() { return p -> p.getAge() > 21 && p.getGender().equalsIgnoreCase("M"); } public static Predicate<Employee> isAdultFemale() { return p -> p.getAge() > 18 && p.getGender().equalsIgnoreCase("F"); } public static Predicate<Employee> isAgeMoreThan(Integer age) { return p -> p.getAge() > age; } public static List<Employee> filterEmployees (List<Employee> employees, Predicate<Employee> predicate) { return employees.stream() .filter( predicate ) .collect(Collectors.<Employee>toList()); } } ``` 您會看到我創建了另一個工具方法`filterEmployees()`,以顯示 **java 謂詞過濾器**。 基本上是使代碼整潔并減少重復。 您也可以編寫多個謂詞來構成**謂詞鏈**,就像在[構建器模式](https://howtodoinjava.com/design-patterns/creational/builder-pattern-in-java/)中所做的那樣。 因此,在此函數中,我們傳遞`employees`的列表并傳遞謂詞,然后此函數將返回滿足**參數謂詞**中提到的條件的`employees`的新集合。 ```java package predicateExample; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static predicateExample.EmployeePredicates.*; public class TestEmployeePredicates { public static void main(String[] args) { Employee e1 = new Employee(1,23,"M","Rick","Beethovan"); Employee e2 = new Employee(2,13,"F","Martina","Hengis"); Employee e3 = new Employee(3,43,"M","Ricky","Martin"); Employee e4 = new Employee(4,26,"M","Jon","Lowman"); Employee e5 = new Employee(5,19,"F","Cristine","Maria"); Employee e6 = new Employee(6,15,"M","David","Feezor"); Employee e7 = new Employee(7,68,"F","Melissa","Roy"); Employee e8 = new Employee(8,79,"M","Alex","Gussin"); Employee e9 = new Employee(9,15,"F","Neetu","Singh"); Employee e10 = new Employee(10,45,"M","Naveen","Jain"); List<Employee> employees = new ArrayList<Employee>(); employees.addAll(Arrays.asList(new Employee[]{e1,e2,e3,e4,e5,e6,e7,e8,e9,e10})); System.out.println( filterEmployees(employees, isAdultMale()) ); System.out.println( filterEmployees(employees, isAdultFemale()) ); System.out.println( filterEmployees(employees, isAgeMoreThan(35)) ); //Employees other than above collection of "isAgeMoreThan(35)" //can be get using negate() System.out.println(filterEmployees(employees, isAgeMoreThan(35).negate())); } } Output: [1 - 23, 3 - 43, 4 - 26, 8 - 79, 10 - 45] [5 - 19, 7 - 68] [3 - 43, 7 - 68, 8 - 79, 10 - 45] [1 - 23, 2 - 13, 4 - 26, 5 - 19, 6 - 15, 9 - 15] ``` 謂詞在 Java 8 中確實是非常好的添加,只要有機會,我都會使用它。 ## 關于 Java 8 中謂詞的最終思考 1. 他們將您的條件(有時是業務邏輯)轉移到中心位置。 這有助于分別對它們進行單元測試。 2. 無需將任何更改復制到多個位置。 Java 謂詞改善了代碼維護。 3. 代碼例如“`filterEmployees(employees, isAdultFemale())`”比編寫`if-else`塊更具可讀性。 好的,這些是我在 Java 8 謂詞中的想法。 您如何看待此特性? 在評論部分與我們所有人分享。 學習愉快! 閱讀更多 : [Java 謂詞取反示例](https://howtodoinjava.com/java8/predicate-negate-example/) [Java 鏈接謂詞 – 邏輯 AND 和邏輯 OR 運算](https://howtodoinjava.com/java8/predicates-logical-operations/)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看