Java 在映射列表(List<;Map<;Integer,String>;)上迭代并查找特定值?
我有一张地图清单<代码>列出行。 我希望遍历列表和所有映射,只查看特定的键-值对,试图找到匹配的字符串值-“hi” 示例:我只对查看范围为5-10的特定键的条目集感兴趣,并检查匹配的值。下面是我的计划。迭代列表检查每个映射是否有匹配项的方法 是否有更好或更清洁/有效的方法Java 在映射列表(List<;Map<;Integer,String>;)上迭代并查找特定值?,java,java-8,Java,Java 8,我有一张地图清单列出行。 我希望遍历列表和所有映射,只查看特定的键-值对,试图找到匹配的字符串值-“hi” 示例:我只对查看范围为5-10的特定键的条目集感兴趣,并检查匹配的值。下面是我的计划。迭代列表检查每个映射是否有匹配项的方法 是否有更好或更清洁/有效的方法 //basic logic for(Map<Integer,String> map : lines) { return map.entrySet().stream() .filter(e -> 11
//basic logic
for(Map<Integer,String> map : lines)
{
return map.entrySet().stream()
.filter(e -> 11 > e.getKey().intValue() && e.getKey().intValue() >= 5)
.anyMatch(entry -> entry.getValue().equalsIgnoreCase("hi"));
}
//基本逻辑
用于(地图:线)
{
返回map.entrySet().stream()
.filter(e->11>e.getKey().intValue()和&e.getKey().intValue()>=5)
.anyMatch(entry->entry.getValue().equalsIgnoreCase(“hi”);
}
由于您已经在使用流,您还可以流式处理列表:
return lines.stream()
.flatMap(map -> map.entrySet().stream())
.filter(entry -> 11 > entry.getKey() && entry.getKey() >= 5)
.anyMatch(entry -> entry.getValue().equalsIgnoreCase("hi"));
如果列表中的任何映射具有键在5和10之间(包括5和10)且值为“hi”(忽略大小写)的条目,则返回
true
,否则返回false
。这是我对你初衷的最好猜测;如果我不正确,请告诉我。因为您已经在使用流,您也可以流式处理列表:
return lines.stream()
.flatMap(map -> map.entrySet().stream())
.filter(entry -> 11 > entry.getKey() && entry.getKey() >= 5)
.anyMatch(entry -> entry.getValue().equalsIgnoreCase("hi"));
如果列表中的任何映射具有键在5和10之间(包括5和10)且值为“hi”(忽略大小写)的条目,则返回
true
,否则返回false
。这是我对你初衷的最好猜测;如果我不正确,请让我知道。如果地图太大,我会同意他的意见。如果可能,使用SortedMap
或NavigableMap
,您可以轻松地应用NavigableMap\subMap
。然后,流
将如下所示:
lines.stream()
.flatMap(m -> m.subMap(5, 11).values().stream())
.anyMatch("hi"::equalsIgnoreCase);
如果地图相当大,我会同意他的意见。如果可能,使用
SortedMap
或NavigableMap
,您可以轻松地应用NavigableMap\subMap
。然后,流
将如下所示:
lines.stream()
.flatMap(m -> m.subMap(5, 11).values().stream())
.anyMatch("hi"::equalsIgnoreCase);
我希望遍历列表和所有映射,只查看特定的键-值对,试图找到匹配的字符串值,然后它会做什么?我只对查看5-10范围内特定键的输入集感兴趣,并检查与您刚才描述的不同的匹配值。一般来说,对于这类问题,您应该给出一个输入和输出集的示例,并解释问题中不变量的用途。似乎您需要一个区间映射。你可以尝试使用@tony你的方法应该返回什么?@flakes。是的,所以我基本上想查看列表中的所有地图,如果在本例中找到“hi”匹配项,则返回true。没有必要继续寻找。只是看看匹配的字符串是否存在。@Misha。只是返回真或假。没有包括整个方法,只是将用于检查的逻辑。但如果在整个列表中找到匹配的字符串,则基本上为真/假。我希望遍历列表和所有映射,只查看特定的键-值对,试图找到匹配的字符串值,那么它会做什么?我只对查看5-10范围内特定键的输入集感兴趣,并检查与您刚才描述的不同的匹配值。一般来说,对于这类问题,您应该给出一个输入和输出集的示例,并解释问题中不变量的用途。似乎您需要一个区间映射。你可以尝试使用@tony你的方法应该返回什么?@flakes。是的,所以我基本上想查看列表中的所有地图,如果在本例中找到“hi”匹配项,则返回true。没有必要继续寻找。只是看看匹配的字符串是否存在。@Misha。只是返回真或假。没有包括整个方法,只是将用于检查的逻辑。但如果在整个列表中找到匹配的字符串,则基本上为真/假。他们不应该在最后收集吗?这返回一个布尔值。看起来OP想要返回一个布尔值,因为他们的stream语句以
return
开头,尽管他们的循环总是在第一次迭代中终止。因为OP只对范围5-11的键感兴趣,所以您可以建议使用IntStream。可能比在所有键上循环并测试它们是否在范围内更有效。@user2478398或更短,lines.stream().anyMatch(map->IntStream.range(5,11).mapToObj(map::get).anyMatch(“hi”::equalsIgnoreCase))代码>。这利用了这样一个事实,即equalsIgnoreCase
已经处理null
参数(返回false
)。或者,您也可以使用lines.stream().anyMatch(map->IntStream.range(5,11).anyMatch(i->“hi”.equalsIgnoreCase(map.get(i));
对于那些不喜欢嵌套anyMatch
s的人,惯用的解决方案是lines.stream().flatMap->IntStream.range(5,11).mapToObj(map::get)).anyMatch(“hi”)::equalsIgnoreCase)
他们不应该最后收集
吗?这返回一个布尔值。看起来OP想要返回一个布尔值,因为他们的stream语句以return
开头,尽管他们的循环总是在第一次迭代中终止。因为OP只对范围为5-11的键感兴趣,所以你可以建议一个IntStream。可能是mor性能优于在所有键上循环并测试它们是否在范围内。@user2478398或更短,lines.stream().anyMatch(map->IntStream.range(5,11).mapToObj(map::get).anyMatch(“hi”::equalsIgnoreCase”);
。这利用了equalsIgnoreCase
已经处理null
参数的事实(返回false
)。或者,您也可以使用lines.stream().anyMatch(map->IntStream.range(5,11).anyMatch(i->“hi”.equalsIgnoreCase(map.get(i));
对于那些不喜欢嵌套anyMatch
s的人,惯用的解决方案是