简体   繁体   English

收集为 HashMap<string,string> 来自 java 中没有 POJO 的对象的列表或 Stream</string,string>

[英]Collect as HashMap<String,String> from a List or Stream of objects without a POJO in java 8

I have a list of objects out of which I have to create a HashMap<String,String> or ConcurrentHashMap<String,String> after applying certain logic on each of the objects in the list.我有一个对象列表,在对列表中的每个对象应用某些逻辑之后,我必须从中创建一个HashMap<String,String>ConcurrentHashMap<String,String> Here is the code which works perfectly fine without using java 8.这是在不使用 java 8 的情况下工作得很好的代码。

 for (Model model : parser.getList()) {
       String name = model.getName();
       String val = parser.getValue(arr, name);
       map.putIfAbsent(name, val);
 }

I was able to translate it as我能够将其翻译为

Map<String, String> map = new HashMap<>();
parser.getList().forEach(model -> map.putIfAbsent(model.getName(),parser.getValue(arr,model.getName())));

However I wanted to explore the usage of Collectors.toMap and see if I can leverage that for this use case.但是我想探索Collectors.toMap的用法,看看我是否可以在这个用例中利用它。 I was trying to do something like below but that isn't the correct usage as I am unable to call the method parser.getValue with params in toMap() .我试图做类似下面的事情,但这不是正确的用法,因为我无法使用toMap()中的参数调用parser.getValue方法。

 Map<String,String> valMap = parser.getFieldList().stream().collect(Collectors.toMap(Model::getName,parser.getValue(arr,Model::getName),(left,right)->right),HashMap::new); 

I was able to use Collectors.toMap() when I created a POJO ValHolder to hold the values as below.当我创建一个 POJO ValHolder 来保存如下值时,我能够使用Collectors.toMap()

Map<String,String> tranMap = parser.getFieldList().stream().map(model -> {
        return new ValHolder(model.getName(),parser.Value(dataArray,model.getName()));
}).collect(Collectors.toMap(ValHolder::getName,ValHolder::getValue,(x,y)->y,HashMap::new));

The POJO created to hold the value is as below为保存该值而创建的 POJO 如下所示

class ValHolder {

    String name;
    String value;

    public String getName() {
        return name;
    }

    public String getValue() {
        return value;
    }

    ValHolder(String name, String val){
        fieldName = name;
        value = val;
    }
}

I would like to know if toMap() can be used without creating a POJO to hold the values to be accessible easily via Method references.我想知道是否可以在不创建 POJO 的情况下使用toMap()来保存可以通过方法引用轻松访问的值。

You don't have to use a method reference.您不必使用方法参考。

For example:例如:

Map<String,String> valMap = 
    parser.getFieldList()
          .stream()
          .collect(Collectors.toMap(Model::getName,
                                    m -> parser.getValue(arr,m.getName()),
                                    (left,right)->right,
                                    HashMap::new));

Or, you can use a Map.Entry implementation instead of your POJO:或者,您可以使用Map.Entry实现而不是您的 POJO:

Map<String,String> tranMap = 
    parser.getFieldList()
          .stream()
          .map(model -> new SimpleEntry<>(model.getName(),parser.getValue(dataArray,model.getName())))
          .collect(Collectors.toMap(Map.Entry::getKey,
                                    Map.Entry::getValue,
                                    (x,y)->y,
                                    HashMap::new));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM