# Consumer、Function、Predicate與Supplier
```java=
public class Test {
public static void main(String[] args) {
List<String> nL = Arrays.asList("Jim","John","Jeff");
Function<String,String> funVal = s->"Hello:".concat(s);
nL.stream().map(funVal).peek(System.out::print);
}
}
```
**Console: 不會顯示任何結果**
```Console=
```
**因為peek 操作接收的是一個 Consumer 函數。**
:::info
JDK8定義的通用函式介面,基本上置放於java.util.function套件之中,就行為來說,基本上可以分為**Consumer、Function、Predicate與Supplier**四種。
---
#### Consumer
如果需要的行為是接受一個參數,然後處理後不傳回值,就可以使用Consumer介面,它的定義是:
```java=
public interface Consumer<T> {
void accept(T t);
}
```
**例如: forEach() , peek()**
---
#### Function
如果需要的是接受一個參數,然後以該參數進行計算後傳回結果,就可以使用Function介面,它的定義是:
```java=
public interface Function<T, R> {
R apply(T t);
}
```
**例如: map()**
---
#### Predicate
如果接受一個參數,然後只傳回boolean值,也就是根據傳入的參數直接判斷真假的行為,就可以使用Predicate函式介面,其定義為:
```java=
public interface Predicate<T> {
boolean test(T t);
}
```
**例如: filter()**
---
#### Supplier
如果需要的行為是不接受任何參數,然後傳回值,那可以使用Supplier函式介面:
```java=
public interface Supplier<T> {
T get();
}
```
**範例:**
```java=
supplier = () -> new Random().nextInt();
System.out.println(supplier.get());
```
:::
**回到本題,如果要讓peek可以正常運作把值印出來,程式修改如下:**
```java=
public static void main(String[] args) {
List<String> nL = Arrays.asList("Jim","John","Jeff");
Function<String,String> funVal = s->"Hello:".concat(s);
nL.stream().map(funVal).peek(System.out::print).collect(Collectors.toList());
}
```
**加上collect之後的Console:**
```Console=
Hello:JimHello:JohnHello:Jeff
```
---
## BiPredicate 、 BiFunction
**Question:**
```java=
public static void main(String[] args) {
BiPredicate<String,String> bp = (String s1,String s2) -> s1.contains("SG") && s2.contains("Java");
BiFunction<String, String, Integer> bf = (String s1,String s2) -> {
int fee = 0;
if(bp.test(s1, s2)) {
fee = 100;
}
return fee;
};
int fee1 = bf.apply("D101SG", "Java Programming");
System.out.println(fee1);
}
```
### What is the result?
A. A compilation error occurs at line 7.
**B. 100**
C. A compilation error occurs at line 8.
D. A compilation error occurs at line 15.
- [x] **Answer: B**
**BiPredicate、BiFunction 就是變成輸入兩個參數**
###### tags: `ocpjp`