在流上創建 Map 時,我想在同一物件串列中插入重復鍵的值。
我用過Collectors.toMap(keyMapper, valueMapper, mergeFunction)。
但我無法為相同的鍵撰寫正確的合并函式。
這是一個顯示確切問題的作業示例代碼。
創建一個名為的 Java 檔案MapCollector并添加以下代碼。
public class MapCollector {
public static Map<ItemType, ItemRequest> breakRequestByItemType(final ItemRequest originalRequest) {
return originalRequest
.getItemStatuses()
.stream()
.filter(e->e.getType()!= null)
.collect(Collectors.toMap(
ItemStatus::getType,
e->ItemRequest
.builder()
.prop1(originalRequest.prop1)
.prop2(originalRequest.prop2)
.itemStatuses(Arrays.asList(e))
.build()
//TODO: Need a merge function that will add this status to the list `itemStatuses`
));
}
}
@Data
@Builder
class ItemRequest{
List<ItemStatus> itemStatuses;
String prop1;
String prop2;
}
enum ItemType{
A,B,C
}
@AllArgsConstructor
@Getter
enum ItemStatus{
A_STATUS_1("some desc1",ItemType.A),
A_STATUS_2("some desc2",ItemType.A),
B_STATUS_1("some desc3",ItemType.B),
B_STATUS_2("some desc4",ItemType.B),
C_STATUS_1("some desc5",ItemType.C);
private final String desc;
private final ItemType type;
}
在 pom.xml 中添加以下依賴項以減少冗長的測驗代碼
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.21.0</version>
</dependency>
</dependencies>
這是顯示預期和測驗值的測驗類
public class MapCollectorTest {
@Test
void testIt(){
final ItemRequest originalRequest = ItemRequest.builder()
.itemStatuses(Arrays.asList(ItemStatus.A_STATUS_1,
ItemStatus.C_STATUS_1,
ItemStatus.B_STATUS_2,
ItemStatus.A_STATUS_2))
.prop1("abc")
.prop2("bcd")
.build();
Map<ItemType, ItemRequest> expectedMap = new HashMap<ItemType, ItemRequest>();
expectedMap.put(ItemType.A, ItemRequest
.builder()
.itemStatuses(Arrays.asList(ItemStatus.A_STATUS_1,ItemStatus.A_STATUS_2))
.prop1("abc")
.prop2("bcd")
.build());
expectedMap.put(ItemType.B, ItemRequest
.builder()
.itemStatuses(Arrays.asList(ItemStatus.B_STATUS_1))
.prop1("abc")
.prop2("bcd")
.build());
expectedMap.put(ItemType.C, ItemRequest
.builder()
.itemStatuses(Arrays.asList(ItemStatus.C_STATUS_1))
.prop1("abc")
.prop2("bcd")
.build());
Assertions.assertThat(MapCollector.breakRequestByItemType(originalRequest))
.containsAllEntriesOf(expectedMap);
}
}
uj5u.com熱心網友回復:
//TODO: 需要一個將這個狀態添加到串列中的合并函式
itemStatuses
的合并函式toMap需要BinaryOperator兩個引數,這些引數是與同一個鍵關聯的值,它們應該被決議為合并函式回傳的單個值。
檔案中的參考:
mergeFunction- 一個合并函式,用于解決與同一鍵關聯的值之間的沖突,如提供給Map.merge(Object, Object, BiFunction)
您需要itemStatuses從兩個值中提取一個串列并使用 將它們組合在一起Collection.addAll,然后回傳一個串列已被修改的值。
(left, right) -> {
left.getItemStatuses().addAll(right.getItemStatuses());
return left;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/530447.html
上一篇:帶有連接節點的鏈接的聚集氣泡
