获取 HashMap<T1, Set<T2>> 的最小键和整数 java 8 种方式
Get minimum key and Integer of HashMap<T1, Set<T2>> with java 8 way
我知道如何从 HashMap<T, Double>
:
获取最小键和元素
public static<T> Map.Entry<T, Double> getEntryOfMinimumVal(Map<T, Double> map) {
return map.entrySet().stream()
.min(Map.Entry.comparingByValue(Double::compareTo)).get();
}
但是,对于包含最小值的 Set
,我无法在 HashMap<T1, Set<T2>>
中获取密钥和 Set
:
/**
* return minimum value of {getValue(elem)}_{elem is T2 values in all values of mapOfSet}
* and key of type T1 whose value (Set<T2) contains the minimum value
*/
public static<T1, T2> Map.Entry<T1, T2> getMinimumKeyAndElement(HashMap<T1, Set<T2>> mapOfSet){
???
}
为什么不分两步完成:
- 在所有集合中找到最小值
- 查找包含具有此值的集合的任何地图条目
因为可能没有这样的值,所以您应该使用 Optional 作为 return 类型。
并且您应该在参数类型中使用通配符,以提供更灵活的 API:
public static<T1, T2> Optional<Map.Entry<T1, Set<T2>>> getMinimumKeyAndElement(Map<? extends T1,? extends Set<? extends T2>> mapOfSet){
T2 minValue = mapOfSet.values().stream().flatMap(Set::stream).min(comparator_for T2);
return mapOfSet.entrySet().stream().filter(s->s.getValue().contains(minValue)).findFirst();
}
我知道如何从 HashMap<T, Double>
:
public static<T> Map.Entry<T, Double> getEntryOfMinimumVal(Map<T, Double> map) {
return map.entrySet().stream()
.min(Map.Entry.comparingByValue(Double::compareTo)).get();
}
但是,对于包含最小值的 Set
,我无法在 HashMap<T1, Set<T2>>
中获取密钥和 Set
:
/**
* return minimum value of {getValue(elem)}_{elem is T2 values in all values of mapOfSet}
* and key of type T1 whose value (Set<T2) contains the minimum value
*/
public static<T1, T2> Map.Entry<T1, T2> getMinimumKeyAndElement(HashMap<T1, Set<T2>> mapOfSet){
???
}
为什么不分两步完成:
- 在所有集合中找到最小值
- 查找包含具有此值的集合的任何地图条目
因为可能没有这样的值,所以您应该使用 Optional 作为 return 类型。 并且您应该在参数类型中使用通配符,以提供更灵活的 API:
public static<T1, T2> Optional<Map.Entry<T1, Set<T2>>> getMinimumKeyAndElement(Map<? extends T1,? extends Set<? extends T2>> mapOfSet){
T2 minValue = mapOfSet.values().stream().flatMap(Set::stream).min(comparator_for T2);
return mapOfSet.entrySet().stream().filter(s->s.getValue().contains(minValue)).findFirst();
}