Java Collectors toConcurrentMap Method - Java 147

Java Collectors toConcurrentMap Method – Java 147

Java Collectors toConcurrentMap Method

使用所提供的靜態方法,傳入 2 個 Function 參數,設定鍵與值轉換成 Map , ToConcurrentMap Java Collectors 介紹常見的 toConcurrentMap 等方法,本篇增加了範例,並透過單元測試來驗證產出結果。

public static <T, K, U> Collector<T, ?, ConcurrentMap<K, U>> toConcurrentMap(
		Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) {
}

檔案目錄

./
   +- src
       +- test
       |   +- org
       |       +- ruoxue
       |           +- java_147
       |               +- collector
       |                   +- CollectorsToConcurrentMapTest.java   

單元測試

Collectors ToConcurrentMap Java 提供設定鍵與值轉換成 Map。

toConcurrentMap

Collectors ToConcurrentMap Java 建立一個 List ,增加三個元素,轉換成 Map 。

	@Test
	public void toConcurrentMap() {
		int expectedSize = 3;
		List<String> list = Arrays.asList("Blueberry", "Melon", "Fig");
		Function<String, String> key = s -> s.toUpperCase();
		Function<String, Integer> length = s -> s.length();
		Map<String, Integer> result = list.stream().collect(Collectors.toConcurrentMap(key, length));
		System.out.println(result);
		assertEquals(expectedSize, result.size());

		result = list.stream().collect(Collectors.toConcurrentMap(Function.identity(), String::length));
		System.out.println(result);
		assertEquals(expectedSize, result.size());

		Function<Integer, Integer> twice = i -> i * i;
		result = list.stream().collect(Collectors.toConcurrentMap(key, length.andThen(twice)));
		System.out.println(result);
		assertEquals(expectedSize, result.size());
	}
{FIG=3, BLUEBERRY=9, MELON=5}
{Fig=3, Blueberry=9, Melon=5}
{FIG=9, BLUEBERRY=81, MELON=25}

toConcurrentMapThrowException

Java Collectors ToConcurrentMap Duplicate Key 建立一個 List ,增加五個元素,轉換成 Map ,當有重複鍵時,會拋出例外。

	@Test(expected = IllegalStateException.class)
	public void toConcurrentMapThrowException() {
		int expectedSize = 3;
		List<String> list = Arrays.asList("Blueberry", "Melon", "Fig", "Blueberry", "Melon");
		Function<String, String> key = s -> s.toUpperCase();
		Function<String, Integer> length = s -> s.length();
		Map<String, Integer> result = list.stream().collect(Collectors.toConcurrentMap(key, length));
		System.out.println(result);
		assertEquals(expectedSize, result.size());
	}
java.lang.IllegalStateException: Duplicate key 9
	at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
	at java.util.concurrent.ConcurrentHashMap.merge(ConcurrentHashMap.java:1990)
	at java.util.stream.Collectors.lambda$toConcurrentMap$59(Collectors.java:1472)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
	at org.ruoxue.java_147.collector.CollectorsToConcurrentMapTest.toConcurrentMapThrowException(CollectorsToConcurrentMapTest.java:42)

toConcurrentMapWithDuplicateKey

Java Collectors ToConcurrentMap Duplicate Key 建立一個 List ,增加五個元素,轉換成 Map ,當有重複鍵時,傳入 BinaryOperator 參數,解決重複鍵拋出例外的問題。

	@Test
	public void toConcurrentMapWithDuplicateKey() {
		int expectedSize = 3;
		List<String> list = Arrays.asList("Blueberry", "Melon", "Fig", "Blueberry", "Melon");
		Function<String, String> key = s -> s.toUpperCase();
		Function<String, Integer> length = s -> s.length();
		Map<String, Integer> result = list.stream()
				.collect(Collectors.toConcurrentMap(key, length, (oldValue, newValue) -> oldValue));
		System.out.println(result);
		assertEquals(expectedSize, result.size());

		result = list.stream()
				.collect(Collectors.toConcurrentMap(Function.identity(), String::length, (oldValue, newValue) -> oldValue));
		System.out.println(result);
		assertEquals(expectedSize, result.size());
	}
{FIG=3, BLUEBERRY=9, MELON=5}
{Fig=3, Blueberry=9, Melon=5}

toConcurrentMapConcurrentHashMap

Collectors ToConcurrentMap Java 建立一個 List ,增加五個元素,指定轉換成 TreeMap 。

	@Test
	public void toConcurrentMapConcurrentHashMap() {
		int expectedSize = 3;
		List<String> list = Arrays.asList("Blueberry", "Melon", "Fig", "Blueberry", "Melon");
		Function<String, String> key = s -> s.toLowerCase();
		Function<String, Integer> length = s -> s.length();
		Function<Integer, Integer> twice = i -> i * i;
		Map<String, Integer> result = list.stream().collect(Collectors.toConcurrentMap(key, length.andThen(twice),
				(oldValue, newValue) -> oldValue, ConcurrentHashMap::new));
		System.out.println(result);
		assertEquals(expectedSize, result.size());
	}
{blueberry=81, fig=9, melon=25}

CollectorsToConcurrentMapTest.java

Collectors ToConcurrentMap Example 新增單元測試,驗證是否符合預期。

package org.ruoxue.java_147.collector;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.junit.Test;

public class CollectorsToConcurrentMapTest {

	@Test
	public void toConcurrentMap() {
		int expectedSize = 3;
		List<String> list = Arrays.asList("Blueberry", "Melon", "Fig");
		Function<String, String> key = s -> s.toUpperCase();
		Function<String, Integer> length = s -> s.length();
		Map<String, Integer> result = list.stream().collect(Collectors.toConcurrentMap(key, length));
		System.out.println(result);
		assertEquals(expectedSize, result.size());

		result = list.stream().collect(Collectors.toConcurrentMap(Function.identity(), String::length));
		System.out.println(result);
		assertEquals(expectedSize, result.size());

		Function<Integer, Integer> twice = i -> i * i;
		result = list.stream().collect(Collectors.toConcurrentMap(key, length.andThen(twice)));
		System.out.println(result);
		assertEquals(expectedSize, result.size());
	}

	@Test(expected = IllegalStateException.class)
	public void toConcurrentMapThrowException() {
		int expectedSize = 3;
		List<String> list = Arrays.asList("Blueberry", "Melon", "Fig", "Blueberry", "Melon");
		Function<String, String> key = s -> s.toUpperCase();
		Function<String, Integer> length = s -> s.length();
		Map<String, Integer> result = list.stream().collect(Collectors.toConcurrentMap(key, length));
		System.out.println(result);
		assertEquals(expectedSize, result.size());
	}

	@Test
	public void toConcurrentMapWithDuplicateKey() {
		int expectedSize = 3;
		List<String> list = Arrays.asList("Blueberry", "Melon", "Fig", "Blueberry", "Melon");
		Function<String, String> key = s -> s.toUpperCase();
		Function<String, Integer> length = s -> s.length();
		Map<String, Integer> result = list.stream()
				.collect(Collectors.toConcurrentMap(key, length, (oldValue, newValue) -> oldValue));
		System.out.println(result);
		assertEquals(expectedSize, result.size());

		result = list.stream()
				.collect(Collectors.toConcurrentMap(Function.identity(), String::length, (oldValue, newValue) -> oldValue));
		System.out.println(result);
		assertEquals(expectedSize, result.size());
	}

	@Test
	public void toConcurrentMapConcurrentHashMap() {
		int expectedSize = 3;
		List<String> list = Arrays.asList("Blueberry", "Melon", "Fig", "Blueberry", "Melon");
		Function<String, String> key = s -> s.toLowerCase();
		Function<String, Integer> length = s -> s.length();
		Function<Integer, Integer> twice = i -> i * i;
		Map<String, Integer> result = list.stream().collect(Collectors.toConcurrentMap(key, length.andThen(twice),
				(oldValue, newValue) -> oldValue, ConcurrentHashMap::new));
		System.out.println(result);
		assertEquals(expectedSize, result.size());
	}
}

心得分享

Collectors ToConcurrentMap Java 提供了幾種 Collectors 常見方法的操作範例,在應用上相當廣泛,熟悉 Collectors ToConcurrentMap Example 這些方法的操作,例如: toConcurrentMap 等方法,可以讓程式碼更加地簡潔及容易維護。

發佈留言