在 java 8 中从没有 POJO 的对象列表或流中收集为 HashMap<String,String>

use*_*686 2 java java-8 java-stream

我有一个对象列表,我必须从中创建一个HashMap<String,String>ConcurrentHashMap<String,String>在对列表中的每个对象应用某些逻辑之后。这是在不使用 java 8 的情况下完美运行的代码。

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

我能够将其翻译为

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

但是,我想探索 的用法,Collectors.toMap看看我是否可以在这个用例中利用它。我试图做类似下面的事情,但这不是正确的用法,因为我无法使用 params调用方法parser.getValuetoMap()

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

Collectors.toMap()当我创建一个 POJO ValHolder 来保存如下值时,我能够使用它。

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));
Run Code Online (Sandbox Code Playgroud)

为保存值而创建的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否toMap()可以在不创建 POJO 的情况下使用来保存通过方法引用轻松访问的值。

Era*_*ran 5

您不必使用方法引用。

例如:

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

或者,您可以使用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));
Run Code Online (Sandbox Code Playgroud)