在Java8中使用stream()访问json中的元素

im9ewurl  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(484)

这个问题在这里已经有答案了

java8中带有流的嵌套列表(4个答案)
如何在Java8中将列表列表转换为列表(11个答案)
java流:flatmap返回对象流(2个答案)
两小时前关门了。
我正在处理我的项目,然后我需要json数据中的reach-an元素如下所示:

[
  {
    "name": "Meltem",
    "items": [
      {
        "name": "Yilmaz",
        "histories": [
          {
            "date": 1615370705561,
            "school": "BAU"
          }
        ]
       }
     ]
   }
]

所以我可以通过以下方式来访问name元素:

var myData = data().
                stream().
                filter(x -> x.getName().equals("Meltem"))
                .collect(Collectors.toList())
                .get(0);

那么,如何在Java8中使用stream()到达学校呢?
此外,还有 getName() 我在那里呼唤;

@Getter
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "name",
        "items",
})
public class Package {
@JsonProperty("name")
    private String name;
@JsonProperty("items")
    private List<Item> items;
}
uxhixvfz

uxhixvfz1#

flatMap 是你的朋友:

var mySchool = data().
    stream()
    .filter(x -> x.getName().equals("Meltem"))
    .flatMap(x->x.getItems().stream())
    .flatMap(item->item.getHistories().stream())
    .map(history->history.getSchool())
    .collect(Collectors.toList())
    .get(0);
``` `flatMap()` 获取流中的每个元素,并根据要运行的操作将每个元素Map到流。然后,它创建一个包含先前加载的每个流的所有元素的流。
我提供的代码给你一个 `List` 所有学校在所有历史中的所有项目中的所有包名 `MeItem` .
如果你只想得到第一个元素,我会用 `Stream#findFirst` 不把它转换成 `List` :

var mySchool = data().
stream()
.filter(x -> x.getName().equals("Meltem"))
.flatMap(x->x.getItems().stream())
.flatMap(item->item.getHistories().stream())
.map(history->history.getSchool())
.findFirst()
.orElse(null);//or use the Optional for whatever you want

zlhcx6iw

zlhcx6iw2#

这应该起作用:

var myData = data.stream()
                     .filter(x -> x.getName().equals("Meltem"))
                     .flatMap(x -> x.getItems().stream())
                     .filter(x -> x.getName().equals("Yilmaz"))
                     .flatMap(x -> x.getHistories().stream())
                     .map(History::getSchool)
                     .collect(Collectors.toList());

假设你的课程是这样的:

public static class Package {
    private String name;
    private List<Item> items;

    public String getName() {
        return name;
    }

    public List<Item> getItems() {
        return items;
    }
}

public static class Item {
    private String name;
    private List<History> histories;

    public String getName() {
        return name;
    }

    public List<History> getHistories() {
        return histories;
    }
}

public static class History {
    private String school;

    public String getSchool() {
        return school;
    }
}
ctrmrzij

ctrmrzij3#

var myData = data().
            stream().
            filter(x -> x.getName().equals("Meltem"))
            .collect(Collectors.toList())
            .get(0).getHistories().get(0).getSchool();

对你不管用吗?

相关问题