考虑一个简单的HashMap<Integer,Integer>
。如何获取存储的所有值,这些键是5的倍数?我已经在Java
和Collections
工作了一段时间,但突然间我一无所知。
任何帮助都将受到高度赞赏。
此致
萨里尔
答案 0 :(得分:6)
List<Integer> values = new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getKey() % 5 == 0) {
values.add(entry.getValue());
}
}
FWIW,类似的Java 8方法可能看起来像
map.entrySet().stream()
.filter(entry -> entry.getKey() % 5 == 0)
.map(Entry<Integer, Integer>::getValue)
.collect(toList());
答案 1 :(得分:2)
Guava有一些辅助方法可以帮助您实现这一目标。特别是Maps.filterKeys(Map, Predicate)
// populate a Map
Map<Integer, Integer> map = new HashMap<>();
map.put(3, 0);
map.put(15, 42);
map.put(75, 1234);
// filter it
Map<Integer, Integer> filtered = Maps.filterKeys(map, new Predicate<Integer>() {
@Override
public boolean apply(Integer input) {
return input % 5 == 0; // filter logic
}
});
// get the values
System.out.println(filtered.values());
打印
[1234, 42]
正如路易斯所说,"this isn't actually more efficient -- or even shorter -- than the "traditional" for-each approach."