Java Gold 例題 parallel

`GroupingByConcurrentExample`クラスの`insert code`部分に入力すると、出力結果が得られるコードはどれでしょうか。
```java
class Product {
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return "Product{name='" + name + "', price=" + price + '}';
    }
}
```

```java
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;

public class GroupingByConcurrentExample {
	public static void main(String[] args) {
		List<Product> products = Arrays.asList(
				new Product("AAAA", 1000.00),
				new Product("BBBB", 500.00),
				new Product("CCCC", 300.00),
				new Product("DDDD", 900.00),
				new Product("EEEE", 125.00),
				new Product("FFFF", 398.00)
		);
		
		ConcurrentMap<String, List<Product>> groupedProducts = 
          products.parallelStream()
                  .collect(Collectors.groupingByConcurrent(/*insert code */));
		
		groupedProducts.forEach((k, v) -> {
			System.out.println("Price Range : " + k);
			v.forEach(System.out::println);
		});
	}

}
```

出力結果
```
Price Range : High
Product{name='DDDD', price=900.0}
Product{name='AAAA', price=1000.0}
Price Range : Low
Product{name='CCCC', price=300.0}
Product{name='EEEE', price=125.0}
Product{name='FFFF', price=398.0}
Price Range : Medium
Product{name='BBBB', price=500.0}
```


A
```java
Product::getPrice;
```

B
```java
p -> {
    if(p.getPrice() >= 800) return "High";
    else if(p.getPrice() >= 400) return "Medium";
    else return "Low";
}
```

C
```java
(Product p) -> {
    if(product.getPrice() >= 800) {
        return "High";
    } else if(product.getPrice() >= 400) {
        return "Medium";
    } else {
        return "Low";
    }
}
```

D
```java
p -> {
    double price = p.getPrice();
    if(price >= 800) "High";
    else if(price >= 400)  "Medium";
    else "Low";
}
```

E
```java
product -> {
    Predicate<Product> f = {
        double price = product.getPrice();
        if(price >= 800)  "High";
        else if(price >= 400) "Medium";
        else  "Low";
    }
    f.test(product)
}
```

F
```java
if(product.getPrice() >= 800) return "High";
else if(product.getPrice() >= 400) return "Medium";
else return "Low";
```

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

B
`Collectors.groupingByConcurrent()`に関する問題です。
データをグループ化するためのメソッドで、大規模なデータを扱う場合や、複数のスレッドで作業を分散させたい場合に役立ちます。
並列処理の利点を活かしながら、データを分類・グループ化することができます。
本コードではグループ化された商品を、価格帯ごとに出力します。
```java
groupingByConcurrent
public static <T,​K> Collector<T,​?,​ConcurrentMap<K,​List<T>>> groupingByConcurrent​(Function<? super T,​? extends K> classifier)

groupingByConcurrent(classifier, toList());
```
型パラメータ:
T - 入力要素の型
K - キーの型
パラメータ:
classifier - 入力要素をキーにマップする分類関数
戻り値:
グループ化操作を実装した、順序付けされていない並行なCollector

分類関数は、要素をあるキーの型Kにマップします。 コレクタによって生成される`ConcurrentMap<K, List<T>>`のキーは、入力要素に分類関数を適用した結果の値であり、対応する値は、分類関数の下で関連キーにマップされた入力要素を含むListになります。
```java
ConcurrentMap<String, List<Product>> groupedProducts = 
          products.parallelStream()
                  .collect(Collectors.groupingByConcurrent(p -> {
                        if(p.getPrice() >= 800) return "High";
                        else if(p.getPrice() >= 400) return "Medium";
                        else return "Low";
                    }));
```

https://qiita.com/T-ngtj/private/df254aacd05be698199a