你会如何对java 8流进行多项操作?

时间:2017-02-21 06:19:42

标签: java java-stream

例如,您有一个要转换为JSONObject的pojo列表。你有一个pojo列表。但是为了转换为JSONObject,您需要使用JSONObject put方法。

JSONObject personJson = new JSONObject();
for(Person person : personList){
   personJson.put("firstName", person.firstName);
   personJson.put("lastName", person.lastname);
   ...
}

如果只是我想做的一项操作,那么我可以做到

personList.stream.map(personJson.put("firstName", person.firstName));

5 个答案:

答案 0 :(得分:6)

 JSONArray array=new JSONArray();
        personList.stream().forEach(element ->
        {
            JSONObject personJson = new JSONObject();
            personJson.put("firstName", element.firstName);
            personJson.put("lastName", element.lastname);
            array.add(personJson);
        });

答案 1 :(得分:3)

这里提到的解决方案正在发挥作用,但它们正在改变流上下文之外的对象,应该避免使用。

因此,而不是使用.forEach(),这是一个返回void的终止操作。正确的方法是使用.map(),就像名称所示,将一个值映射到另一个值。在您的情况下,您要执行的第一个操作是将Person映射到JSONObject。第二个操作是reducer函数,您希望将所有JSONObjects减少为一个JSONArray对象。

public JSONArray mapListToJsonArray(List<Person> persons) {
    List<JSONObject> jsonObjects = persons
            .stream()
            .map(person -> {
                JSONObject json = new JSONObject();
                json.put("firstName", person.getFirstName());
                json.put("lastName", person.getLastName());
                return json;
            })
            .collect(Collectors.toList());
    return new JSONArray(jsonObjects);
}

不幸的是,JSONArray的json.org实现没有办法轻松合并两个数组。所以我不是简化为JSONArray,而是首先将所有JSONObjects作为List收集并从中创建一个JSONArray。

如果用方法引用替换lambda表达式,解决方案看起来会更好。

public JSONArray mapListToJsonArray(List<Person> persons) {
    List<JSONObject> jsonObjects = persons
            .stream()
            .map(this::mapPersonToJsonObject)
            .collect(Collectors.toList());
    return new JSONArray(jsonObjects);
}

public JSONObject mapPersonToJsonObject(Person person) {
    JSONObject json = new JSONObject();
    json.put("firstName", person.getFirstName());
    json.put("lastName", person.getLastName());
    return json;
}

答案 2 :(得分:2)

personList.forEach(person ->   
   {
     personJson.put("firstName",person.firstName);
     personJson.put("lastName", person.lastName);
  });

答案 3 :(得分:1)

这是一个返回JSON数组的工作代码。

let service = TestBed.get(InteractWithServerService);
spyOn(service, 'get').and.returnValue(..)
// do test

希望这会有所帮助。快乐的编码!

答案 4 :(得分:1)

@rathna的解释是正确的。当您发现自己键入collection.stream().forEach()时,应将其折叠为collection.forEach()