我有像这样的覆盖方法
@Override
public Build auth (Map.Entry<String, String> auth) {
this.mAuth = auth;
return this;
}
这里尝试按以下方式调用此方法
Map<String, String> authentication = new HashMap<String , String> ();
authentication.put("username" , "testname");
authentication.put("password" , "testpassword");
Map.Entry<String, String> authInfo =(Entry<String , String>) authentication.entrySet();
AuthMethod.auth(authInfo)
正在运行此功能
java.lang.ClassCastException: java.util.HashMap$EntrySet cannot be cast to java.util.Map$Entry
如何将Map.Entry<String, String>
传递给auth方法
答案 0 :(得分:6)
您正在尝试将一个集转换为单个条目。
您可以通过迭代集合来使用每个条目项目:
Iterator it = authentication.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next(); //current entry in a loop
/*
* do something for each entry
*/
}
答案 1 :(得分:4)
嗯,是的。
您正在尝试将Set<Map.Entry<String, String>>
转换为单个Map.Entry<String, String>
。
您需要在集合中选择一个元素,或者迭代每个条目并对其进行处理。
以下内容:
for (Map.Entry<String, String> entry: authentication.entrySet()) {
// TODO logic with single entry
}
答案 2 :(得分:3)
Map.Entry<String, String> authInfo =(Entry<String, String>) authentication.entrySet();
这里你做错了演员。您提到的auth方法似乎只期望用户名/密码对的值。所以像下面这样的事情会做:
Map<String, String> authentication = new HashMap<String, String>();
authentication.put("testname", "testpassword");
Map.Entry<String, String> authInfo = authentication.entrySet().iterator().next();
AuthMethod.auth(authInfo)
答案 3 :(得分:1)
authentication.entrySet()
是Entry
的集合。您可以像这样处理它们:
authentication.entrySet().stream().map(x->auth(x)).collect(Collectors.toList())
答案 4 :(得分:1)
如果我们想要返回一个特定的Entry(行),我们需要通过iterator.next()迭代第一个条目:
Map.Entry<String, String> authInfo = (Entry<String, String>)
authentication.entrySet().iterator().next();
如果我们想迭代地图,我们需要保持这是一个循环:
for( Map.Entry<String, String> authInfo : authentication.entrySet()){
System.out.println("authInfo:"+authInfo.getKey());
}
答案 5 :(得分:1)
以下函数可作为一般迭代,设置,获取地图值的参考。
(Iterator<Entry> i = entries.iterator(); i.hasNext(); ) {
Map.Entry e = (Entry) i.next();
if(((String)e.getValue())==null ){
i.remove();
} else {
e.setValue("false");
}
System.out.println(e.getValue());
}
答案 6 :(得分:0)
我终于设法做到了,但是举步维艰,我真的不明白为什么这么复杂
package utils;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.TreeTraversingParser;
import models.Product;
import play.Logger;
import play.libs.Json;
public class ProductDeserializer extends JsonDeserializer<List<Product>>{
@Override
public List<Product> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
Map.Entry<String,ObjectNode> map;
try {
TreeTraversingParser parser=(TreeTraversingParser)p;
Class ftClass = parser.getClass();
Field nodeCursor = ftClass.getDeclaredField("_nodeCursor");
boolean nodeCursorAccessible=nodeCursor.isAccessible();
// Allow modification on the field
nodeCursor.setAccessible(true);
Class nodeClass =nodeCursor.get(parser).getClass();
Field content = nodeClass.getDeclaredField("_current");
boolean contentAccessible=content.isAccessible();
content.setAccessible(true);
map=(Map.Entry<String,ObjectNode>)content.get(nodeCursor.get(parser));
ObjectNode ob=map.getValue();
nodeCursor.setAccessible(nodeCursorAccessible);
content.setAccessible(contentAccessible);
return Json.mapper().readValue(ob.get("order_rows").traverse(), new TypeReference<List<Product>>(){});
}catch(Exception e) {
Logger.error("could not map product for this order"+p.getCurrentValue().toString());
}
return null;
}
}