java迭代映射<;字符串,列表<;字符串>,getordefault方法

java迭代映射<;字符串,列表<;字符串>,getordefault方法,java,list,generics,java-8,Java,List,Generics,Java 8,我有一张的地图, 如果列表存在,我要做的是在映射值中添加一个字符串,否则创建一个列表并将其添加到列表中,然后插入map。 s1,s2是字符串 代码: Map Map=newhashmap(); map.put(s1,(map.getOrDefault(s1,newLinkedList()).add(s2)); 错误: error: incompatible types: boolean cannot be converted to List<String> 错误:不兼容类型:无法

我有一张>的地图, 如果列表存在,我要做的是在映射值中添加一个字符串,否则创建一个列表并将其添加到列表中,然后插入
map
s1
s2
是字符串

代码:

Map Map=newhashmap();
map.put(s1,(map.getOrDefault(s1,newLinkedList()).add(s2));
错误:

error: incompatible types: boolean cannot be converted to List<String>
错误:不兼容类型:无法将布尔值转换为列表
这有什么问题

这个电话

(map.getOrDefault(s1, new LinkedList())).add(s2)
返回一个
布尔
原语,该原语不能强制转换到
列表
。这就是为什么你会出现这个错误

你可以这样解决它

map.compute(s1, (k, v) -> v == null ? new LinkedList<>() : v).add(s2);
map.compute(s1,(k,v)->v==null?新建LinkedList():v);

这里的诀窍是,
map.compute()
返回与指定键关联的新值,然后您可以将s2字符串文字添加到该值中。

列表的add方法“map.getOrDefault(s1,new LinkedList())。add(s2)”是返回布尔值,因此您必须在单独的行中执行

所以试着这样做

    Map< String, List< String>> map = new HashMap<>();

    List<String> list = map.get(s1);
    if(list == null){
      list = new LinkedList<>();
      map.put(s1,list);
    }
    list.add(s2);
Map>Map=newhashmap();
List=map.get(s1);
if(list==null){
列表=新的LinkedList();
地图放置(s1,列表);
}
列表。添加(s2);
如果使用Java8并且需要在单行中执行,请执行以下操作

    map.computeIfAbsent(s1, k -> new LinkedList<>()).add(s2); 
map.computeIfAbsent(s1,k->newLinkedList()).add(s2);
Map Map=newhashmap();
//获取值(如果该值存在于映射中),否则初始化列表
List li=map.getOrDefault(s1,newlinkedlist());
li.加入(s2);
地图放置(s1,li);

在这种情况下比
compute
更好。因为它是在Java 8中添加的,所以很公平地假设OP有Java 8。@Andreas感谢您的输入,我以前没有使用“getOrDefault”方法。再次感谢您的宝贵意见。@Holger yep true我使用LinkedList是因为向LinkedList提问,否则ArrayList更好。谢谢你在我之前的评论中输入一个错误。Op最初的方法是使用
List=map.getOrDefault(s1,newLinkedList());列表。添加(s2);putIfAbsent地图(s1,列表)map.computeifassent(s1,k->newlinkedlist()).add(s2)仍然是直截了当和更高效的。如前所述,…这真的很有帮助,谢谢@janith1024,我发现我错过了在Java8中使用lambda或匿名函数的机会。我可以用其他方式来做,但是是的,这台电脑真的是一个一线救世主
    map.computeIfAbsent(s1, k -> new LinkedList<>()).add(s2); 
Map<String, List<String>> map = new HashMap<>();

// gets the value if it is present in the map else initialze the list
List<String> li = map.getOrDefault(s1,new LinkedList<>());

li.add(s2);

map.put(s1,li);