【发布时间】:2019-05-16 11:10:10
【问题描述】:
我有一个类似如下所示的 json。要求是根据id获取key值。 IE。假设 Id 为 A1 键值应返回 2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs。键数组将始终只包含一个元素。
{
"keys": [
{
"id": "A1",
"key": [
"2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs"
]
},
{
"id": "A2",
"key": [
"swKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sfsf2dew"
]
},
{
"id": "A3",
"key": [
"EyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3Mubdwe2"
]
}
]
}
为了实现上述,我使用 Java8 Stream 编写了以下代码,但问题是它返回 Optional<KeyDetails>,我需要再次解析并获取键值
String keyDetails = "{\"keys\":[{\"id\":\"A1\",\"key\":[\"2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs\"]},{\"id\":\"A2\",\"key\":[\"swKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sfsf2dew\"]},{\"id\":\"A3\",\"key\":[\"EyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3Mubdwe2\"]}]}";
AccessKeys accessKeys = new ObjectMapper().readValue(keyDetails, AccessKeys.class);
Optional<KeyDetails> filteredKey = accessKeys.getKeys().stream().filter(key-> key.getId().equals("A3")).findAny();
if(filteredKey.isPresent()) {
String keyValue = filteredKey.get().getKey().get(0);
System.out.println("keyValue==>"+keyValue);
}
我想要的是获得Optional<String> 而不是Optional<KeyDetails>。也就是说,如果 id 存在,它应该只返回键数组中存在的键值。
json 满足的一些条件是:
- 有时可能会出现重复键 ID 的情况,在这种情况下,它应该只选择一个(第一个)
- 键数组将始终包含一个字符串值
谁能帮我解决这个问题
【问题讨论】:
-
试试这个
accessKeys.getKeys() .stream().filter(key-> key.getId(.equals("A3")).findAny() .map(filteredKey->filteredKey.getKey().get(0)) .orElse(null); -
您的代码似乎符合您的要求,除了您应该使用
findFirst而不是findAny来保证返回第一项。你有什么问题?这里有什么问题? -
@HadiJ 感谢您的回答,但如何获得
Optional<String>而不是普通的String -
@Aomine 其实我想在我的
if(filteredKey.isPresent())代码中避免filteredKey.get().getKey().get(0);
标签: java collections java-8 java-stream filtering