【发布时间】:2021-02-17 03:09:10
【问题描述】:
你好朋友我有以下问题,我只是使用java 8所以我正在努力做以下事情。
制作如下界面
public interface AbstracConvert <T,M>{
public M fromMap(T tupla, List<String> keys);
public default List<M> fromMap(List<T> tuplas, List<String> keys){
return tuplas.stream().map(e-> fromMap(e,keys)).collect(Collectors.toList());
}
}
以及下面的实现
@Component
public class TupleConvert implements AbstracConvert<Tuple, Map<String, Object>>{
@Override
public Map<String, Object> fromMap(Tuple tupla, List<String> keys) {
Map<String, Object> response = new HashMap<>();
response.put("name", tupla.get("name_build"));
response.put("idDir", tupla.get("id_dir"));
return response;
}
}
基本思想是能够将元组列表转换为映射列表,以便能够在响应中显示它但是,在我的实现中,我正在做的是知道查询元素的别名和将它们放在地图中会产生以下响应
{
"name" : "name1",
"idDir" : 3
},
{
"name" : "name2",
"idDir" : 4
} ....
我想通过发送一个包含映射键值的列表并根据另一个带有别名的列表输入它的每个值来改进我的方法,这是为了使它更通用
我的@Service 中有以下内容
@Service
public class TestAppImpl implements TestApp {
@Autowired
private TestJpaDao testJpaDao;
@Autowired
private TupleConvert convert;
@Override
public List<Map<String, Object>> find(String query) {
List<String> keys = new ArrayList<>();
keys.add("name");
keys.add("idDir");
return convert.fromMap(testJpaDao.execute(query), keys);
}
}
在我的班级里
@Component
public class TupleConvert implements AbstracConvert<Tuple, Map<String, Object>>{
@Override
public Map<String, Object> fromMap(Tuple tupla, List<String> keys) {
List<String> alias = tupla.getElements().stream().map(t->t.getAlias()).collect(Collectors.toList());
Map<String, Object> result = new LinkedHashMap<>();
result= keys.stream().collect(Collectors.toMap(*keys list value* , *tuple value according to alias list*));
return result;
}
}
我想要做的是能够通过迭代字符串列表,根据一种方法,使用树集的键和值来制作地图。
键的值与 get 方法的忙别名不同,这就是为什么我得到一个包含别名值的列表
@Override
public Map<String, Object> fromMap(Tuple tuple, TreeSet<String> keys) {
List<String> alias = tuple.getElements().stream().map(t-> t.getAlias()).collect(Collectors.toList());
return keys.stream()
.collect(Collectors.toMap(Function.identity(),t-> t.get(alias.stream().reduce((first,second) -> second).map((String x)-> x).orElse(null)));
}
}
如果我这样做,它会返回地图,但会返回从别名列表中获得的最后一个值
{
“var1”: “hehejej”,
“var2”: “hehejej”,
“var3” :“hehejej”
}
我的键列表是这样的
TreeSet<String> keys = new TreeSet();
keys.add(“var1”);
keys.add(“var2”);
keys.add(“var3”);
我想要实现的是为每个键分配从 get 方法获得的值,例如
{
“var1”: 36467,
“var2”: 122,
“var3”: “hehejej”
}
【问题讨论】:
-
可以把
Tupleclass/interface的内容也发一下吗? -
您应该在您的问题中展示一个完整的示例及其输入和所需的输出。
标签: java spring-boot spring-mvc lambda java-8