如何编写 Collectors.toMap() 的合并函数

Raj*_*ate 0 java collections java-stream

UserMst是对象,users也是我从中获取 LoginId && TenantId 的列表。

LinkedHashMap<String, String> Tmap = users.stream().collect(Collectors.toMap(
                    UserMst::getLoginId, UserMst::getTenantId,
                        (x, y)-> ((x=="1") ? "Rocks" : (x=="2")
                                           ? "Mocks" : (x=="3")
                                           ? "Docs"  : (x=="4")
                                           ? "Pocks" : "")
                                   + " ,  " + ( (y=="1") ? "Rocks": (y=="2")
                                                         ? "Mocks": (y=="3")
                                                         ? "Docs" : (y=="4")
                                                         ? "Pocks": ""),
                        LinkedHashMap::new));


///////////////////

LinkedHashMap<String, String> Tmap =
    users.stream().collect(
        Collectors.toMap( UserMst::getLoginId, UserMst::getTenantId,
        (x, y)-> x + ", " + y, LinkedHashMap::new)); 

```

It gives output as answer:: rajat=1,2,3 dave=1,2 milind=2,3
I just need these 1,2,3,4 replaced with strings

Run Code Online (Sandbox Code Playgroud)

Era*_*ran 6

第三个参数Collectors.toMap()是 merge 函数,该函数获取 的两个值Map,并返回一个“合并”值。这用于合并与同一键对应的多个值。

不适合将地图的值从“1”、“2”、“3”...转换为其他String值。

要将数值替换为Strings,您可以在值映射器中执行转换:

LinkedHashMap<String, String> Tmap = 
    users.stream()
         .collect(Collectors.toMap(UserMst::getLoginId,
                                   u -> convert(u.getTenantId()),
                                   (x, y)-> x + ", " + y,
                                   LinkedHashMap::new)); 
Run Code Online (Sandbox Code Playgroud)

其中convert是一个接受String诸如“1”并返回相应的 的方法String

例如:

public static convert (String x)
{
    return x.equals("1")?"Rocks":x.equals("2")?"Mocks":x.equals("3")?"Docs":x.equals("4")?"Pocks":"";
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以向类添加UserMst一个方法,该方法返回StringgetTenantID()该实例对应的方法,然后只需编写:

LinkedHashMap<String, String> Tmap = 
    users.stream()
         .collect(Collectors.toMap(UserMst::getLoginId,
                                   UserMst::getTenantString,
                                   (x, y)-> x + ", " + y,
                                   LinkedHashMap::new)); 
Run Code Online (Sandbox Code Playgroud)

  • 您知道,您可以使用“switch”而不是“String”(不过,即将推出的“switch”表达式会让它变得更好)。值得一提的是另一种选择,`groupingBy(UserMst::getLoginId, LinkedHashMap::new, mapping(UserMst::getTenantString, join(", ")))` (6认同)