# 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`