# findAny, findFirst,anyMatch,allMatch方法 - [Java8中findAny和findFirst的差別](https://blog.csdn.net/huanghanqian/article/details/102807972) :::info - findFirst:回傳第一個元素 - findAny: 回傳的元素是不確定的,對於同一個list多次調用findAny可能會回傳不同的值。如果是單一stream,會回傳第一個元素,但如果是平行化的stream(.parallel()),會隨機的回傳元素 ```java= public static void main(String[] args) { List<String> cs = Arrays.asList("Java EE","Java ME","Java"); int i=0; while(true) { System.out.println(i++); if(cs.stream().parallel().findAny().get().equals("Java")) { break; } } System.out.println("break"); } ``` ```Console= 0 1 2 3 4 5 break ``` ::: - [anyMatch,allMatch的差別](https://blog.csdn.net/qq_28410283/article/details/80783946) :::info - **anyMatch** :判斷的條件裡,只要有元素符合就回傳true - **allMatch** :判斷的條件裡,所有元素都符合才回傳true - **noneMatch**:allMatch相反,判斷的條件裡,所有元素都不符合才回傳true ::: **Question:** ```java= public static void main(String[] args) { List<String> cs = Arrays.asList("Java","Java EE","Java ME"); // line n1 System.out.println(b); } ``` ## Which code fragment, when inserted at line n1, ensures false is printed? A. boolean b = cs.stream() .findAny() .get() .equals("Java"); B. boolean b = cs.stream() .anyMatch (w -> w.equals ("Java")); C. boolean b = cs.stream() .findFirst() .get() .equals("Java"); **D. boolean b = cs.stream() .allMatch(w -> w.equals("Java"));** - [x] **Answer: D** :::warning - 選項A: findAny在單一stream會回傳第一個元素判斷結果,所以是true. - 選項B: anyMatch只要有元素符合判斷都會回傳true. - 選項C: findFirst會回傳第一個元素判斷結果,所以是true. - 選項D: allMatch要所有元素都符合判斷結果,所以是false. ::: --- Example: ```java= List<String> colors = Arrays.asList("red", "green", "yellow"); Predicate<String> test = n - > { System.out.println("Searching..."); return n.contains("red"); }; colors.stream() .filter(c -> c.length() > 3) .allMatch(test); ``` Console: ``` Searching... ``` :::info 因為**allMatch** :判斷的條件裡,所有元素都符合才回傳true,所以當有條件不符合時,就中斷傳回false,所以上面Console才只會印出一次Searching... 如果此題改成anyMatch的話,則會印出兩個Searching... ::: --- Example: ```java= List<String> str = Arrays.asList("my", "pen", "is", "your", "pen"); Predicate<String> test = s -> { int i = 0; boolean result = s.contains("pen"); System.out.print((i++)+":"); return result; }; str.stream().filter(test).findFirst().ifPresent(System.out::print); ``` Console: ```= 0:0:pen ``` :::info findFirst方法,會使得filter方法找到第一個符合「保留包含『pen』子字串的字串元素」後,就直接回傳結果。 ::: ###### tags: `ocpjp`