---
# System prepended metadata

title: reduce的用法
tags: [ocpjp]

---

# reduce的用法
[參考網站](https://juejin.im/post/6844904037989646344)

**Question:**
```java=
public static void main(String[] args) {
    List<String> nums = Arrays.asList("EE","SE");
    String ans = nums.parallelStream().reduce("Java", (a,b)->a.concat(b));
    System.out.println(ans);
}
```
## What is the result?
A. Java EEJava EESE
B. Java EESE
C. The program prints either:
Java EEJava SE
or
Java SEJava EE
**D. Java EEJava SE**
- [x] **Answer: D**

:::info

reduce 有三種
- Optional<T> reduce(BinaryOperator<T> accumulator);

- T reduce(T identity,BinaryOperator<T> accumulator); //多了一個初始值

- U  reduce(U identity,BiFunction<U,? super T,U> accumulator,BinaryOperator<U> combiner);

:::

:::warning
stream() 與 parallelStream()的差別在於, parallelStream 是平行執行的
:::

**Example:**
```java=
List<String> qwords = Arrays.asList("why ","what ","when ");
BinaryOperator<String> operator = (s1,s2) -> s1.concat(s2);
String sen = qwords.stream().reduce("Word: ", operator);
System.out.println(sen);
```

Console:
```=
Word: why what when 
```
如果這題是parallelStream()的話, 答案會變成
Word: why Word: what Word: when 

---
```java=
class Product{
	int id;
	int price;
	public Product(int id,int price){
		this.id = id;
		this.price = price;
	}
	public String toString() {
		return id + ":"+price;
	}
}
public class Test {

	public static void main(String[] args) {
		List<Product> products = new ArrayList(Arrays.asList(new Product(1, 10),new Product(2, 30),new Product(2, 30)));
		Product p = products.stream().reduce(new Product(4,0), (p1,p2)->{
			p1.price+=p2.price;
			return new Product(p1.id, p1.price);
		});
		products.add(p);
		System.out.println(products);
		products.stream().parallel().reduce((p1, p2) -> p1.price > p2.price ? p1 : p2).ifPresent(System.out::println);
	} 
}

```
Console:
```=
[1:10, 2:30, 2:30, 4:70]
4:70
```
:::info
ifPresent()
當存在時, 執行裡面的動作
:::
###### tags: `ocpjp`
