【问题标题】:how to make a map from some lists with lambdas?如何从一些带有 lambdas 的列表中制作地图?
【发布时间】: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


【解决方案1】:

首先,keys 参数的名称暗示它是一个键的集合,因此它不应该具有重复值,因此最好将其声明为 Set 而不是 List,其次您可以访问到你的Tuple 的元素,如果你有,问题解决如下:

public class TupleConvert  implements AbstracConvert<Tuple, Map<String, Object>> {

    @Override
    public Map<String, Object> fromMap(Tuple tuple, Set<String> keys) {
        return keys.stream()
                .collect(Collectors.toMap(Function.identity(), tuple::getByKey));
    }
}

如果你没有,你可能有类似getValue on Element in Tuple 的方法然后你可以像下面这样实现它:

public class TupleConvert  implements AbstracConvert<Tuple, Map<String, Object>> {

    @Override
    public Map<String, Object> fromMap(Tuple tuple, Set<String> keys) {
        Map<String, Object> result = new LinkedHashMap<>();
        return tuple.getElements().stream().filter(t -> keys.contains(t.getAlias()))
                .collect(Collectors.toMap(Element::getAlias, Element::getValue));

    }
}

【讨论】:

  • 你好,我已经做了一些事情,我知道你提到的,但是我有问题,我已经更新了问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 2021-07-13
  • 2011-08-02
  • 1970-01-01
  • 2021-10-13
相关资源
最近更新 更多