2016-01-07 6 views
4

Я пытаюсь преобразовать JSONArray в Map<String,String> через streams и Lambdas. Ниже не работает:Java-8 JSONArray to HashMap

org.json.simple.JSONArray jsonArray = new org.json.simple.JSONArray(); 
jsonArray.add("pankaj"); 
HashMap<String, String> stringMap = jsonArray.stream().collect(HashMap<String, String>::new, (map,membermsisdn) -> map.put((String)membermsisdn,"Error"), HashMap<String, String>::putAll); 
HashMap<String, String> stringMap1 = jsonArray.stream().collect(Collectors.toMap(member -> member, member -> "Error")); 

избежать типажей в Line 4, я делаю Line 3

Line 3 дает следующие ошибки:

Multiple markers at this line 
- The type HashMap<String,String> does not define putAll(Object, Object) that is applicable here 
- The method put(String, String) is undefined for the type Object 
- The method collect(Supplier, BiConsumer, BiConsumer) in the type Stream is not applicable for the arguments (HashMap<String, String>::new, (<no type> map, <no type> membermsisdn) 
-> {}, HashMap<String, String>::putAll) 

И Line 4 дает следующее сообщение об ошибке:

Type mismatch: cannot convert from Object to HashMap<String,String> 

Я пытаюсь узнать Лямбдас и ручьи. Может кто-нибудь мне помочь?

+1

Я не думаю, что это обязательно дубликат. Это преобразование JSONArray, и проблема возникает из-за использования lambdas –

+0

@ozOli READ/THINK два раза, прежде чем вы будете замечать или реагировать на то, что, по вашему мнению, неверно –

ответ

3

Похоже, что JSONArray json-simple расширяет ArrayList без предоставления каких-либо общих типов. Это приводит к тому, что stream возвращает Stream, который также не имеет такого типа.

Зная это, мы можем программировать на интерфейсе List вместо JSONArray

List<Object> jsonarray = new JSONArray(); 

Делать это позволит нам правильно течь следующим образом:

Map<String, String> map = jsonarray.stream().map(Object::toString).collect(Collectors.toMap(s -> s, s -> "value")); 
+0

Это задание генерирует предупреждение компилятора. Он должен быть «List ', а не 'List '. – VGR

+0

@VGR Он не генерирует никаких предупреждений. Я просто попробовал. –

+0

Он генерирует предупреждение в зависимости от ваших настроек. Тем не менее, он также будет генерировать предупреждение на '.add', поэтому я не слишком много думал об этом. –