带JSON数组的map()

Vis*_*tna -2 java json dictionary java-8 java-stream

不寻找杰克逊解决方案。

进口清单:

import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.util.List;
import java.util.stream.Collectors;
Run Code Online (Sandbox Code Playgroud)

JSON数据:

{
    "Name": "ABC.com",
    "Developer": "Vishwa ratna",
    "Project List": [
        "Compnay: National",
        "Compnay: Enterprise",
        "Compnay: Alamo"
    ]
}
Run Code Online (Sandbox Code Playgroud)

我的程序:

 @SuppressWarnings("unchecked")
    public  static  void main(String[] args)
    {
        File text = new File("R:/TestJSON.txt");
        JSONParser parser = new JSONParser();
        try {
            Object obj = parser.parse(new FileReader("R:\\Desktop\\TestJSON.txt"));
            JSONObject jsonObject = (JSONObject) obj;
            List<String> list = new ArrayList<>();
            String name = (String) jsonObject.get("Name");
            System.out.println(name);
            String author = (String) jsonObject.get("Developer");
            System.out.println(author);
            JSONArray companyList = (JSONArray) jsonObject.get("Project List");
            companyList.stream().map(e->{if(e.equals("Compnay: National")); return e;}).collect(Collectors.toList());
            list.forEach(System.out::println);
        }
        catch (Exception e)
        {}
    }
}
Run Code Online (Sandbox Code Playgroud)

一切正常执行,除了

companyList.stream().map(e->{if(e.equals("Compnay: National")); return e;}).collect(Collectors.toList());
            list.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

我可以以其他方式获得期望的结果,但是我想知道为什么我的地图没有返回任何东西?它不应该回来Compnay: National

结果我得到:

ABC.com
Vishwa ratna
Run Code Online (Sandbox Code Playgroud)

我期望:

ABC.com
Vishwa ratna
Compnay: National
Run Code Online (Sandbox Code Playgroud)

编辑:即使filter()按照某些人的建议在这里使用后,我也无法获得所需的结果。

YCF*_*F_L 5

  • 一个你必须使用filter替代map
  • 其次,您必须将collect的结果分配给list

您的代码应为:

   list = (List<String>) companyList.stream()
           .filter(e-> e.equals("Compnay: National"))
           .map(Object::toString)
           .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

另一个解决方案可能是在过滤器收集到toArray之后,然后将数组转换为流,然后使用Object :: toString的map然后收集到列表,这也可以工作

 list = Arrays.stream(
            companyList.stream()
                 .filter(e -> e.equals("Compnay: National"))
                 .toArray())
           .map(Object::toString)
           .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

为什么要过滤而不是映射

map总会返回结果,因此,如果您在内部创建条件,则map必须使用elsepart,它会在您的情况下起作用,因为您有错别字,您的条件不会产生任何罪过,但为什么在a中使用if map,并且您有filter能力避免条件?

Stream<T> filter(Predicate<? super T> predicate)
Run Code Online (Sandbox Code Playgroud)

就像你看到filter了一个谓词返回一个新的流不是一个布尔就像你在您的评论说: