Ale*_*Man 1 java collections filtering java-8 java-stream
我有一个类似如下所示的 json。需求是根据id获取key值。IE。假设如果 Id 是 A1键值应返回2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs。键数组始终只包含一个元素。
{
"keys": [
{
"id": "A1",
"key": [
"2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs"
]
},
{
"id": "A2",
"key": [
"swKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sfsf2dew"
]
},
{
"id": "A3",
"key": [
"EyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3Mubdwe2"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
为了实现上述内容,我使用 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);
}
Run Code Online (Sandbox Code Playgroud)
我想要的是得到Optional<String>而不是Optional<KeyDetails>。即,如果 id 存在,它应该只返回键数组中存在的键值。
json 满足的一些条件是:
谁能帮我解决这个问题
有时可能会出现重复密钥 ID 的情况,在这种情况下它应该只选择一个(第一个)
您正在寻找map方法(进行转换),而findFirst不是findAny始终保证返回第一个匹配项。
accessKeys.getKeys()
.stream()
.filter(key-> key.getId().equals("A3"))
.findFirst()
.map(e -> e.getKey().get(0)).orElse(null);
Run Code Online (Sandbox Code Playgroud)
findAny顾名思义,应该在您不关心返回哪个匹配项的情况下使用。是的,两者findFirst在findAny顺序流中的行为相同,但我宁愿首先明确我的意图。
| 归档时间: |
|
| 查看次数: |
3719 次 |
| 最近记录: |