Java 8哈希映射

Ome*_*mer 6 java java-8 java-stream

我有一张地图Map<String, List<Double>,我想在所有列表中找到最大值(或最小值).该函数应返回最大(或最小)值和属于该值的键.

签名可能是

public static Pair<String,Double> getKeyValue(Map<String, List<Double>> map, BinaryOperator<Double> function)

获取地图和功能Double::maxDouble::min

如何使用java 8,stream api有效地(并且精美地)实现它?

Hol*_*ger 4

ABinaryOperator对于该任务来说不是一个好的规范,它可以直接用于减少以产生适当的值,例如最小值或最大值,但是它不适合返回像 \ Mapxe2\x80\x99s 键这样的关联值价值。以这种方式使用它意味着实现必须执行额外的操作来找出BinaryOperator实际做了什么,以便在归约期间选择正确的键值。更糟糕的是,它不能保证执行BinaryOperator某种允许执行这种归约的操作,例如运算符可能返回一个不是其参数的值。

\n\n

对于这样的任务, aComparator是更好的选择,因为它旨在指定排序并执行相关操作,例如查找最大值和最小值。一个实现可能如下所示:

\n\n
public static Pair<String,Double> getMinimumKeyValue(\n    Map<String, List<Double>> map, Comparator<Double> function) {\n\n    return map.entrySet().stream()\n        .map(e->new Pair<>(e.getKey(), e.getValue().stream().min(function).get()))\n        .min(Comparator.comparing(Pair::getRight, function)).get();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它的命名是getMinimumKeyValue因为当您传入 时它将返回最小的键/值对Comparator.naturalOrder()

\n\n

但你也可以通过传递来获得最大值Comparator.reverseOrder()

\n\n

而且它\​​xe2\x80\x99很容易修改以支持更广泛的用例:

\n\n
public static <K,V> Pair<K,V> getMinKeyValue(\n    Map<K, ? extends Collection<V>> map, Comparator<? super V> function) {\n\n    return map.entrySet().stream()\n        .map(e->new Pair<>(e.getKey(), e.getValue().stream().min(function).get()))\n        .min(Comparator.comparing(Pair::getRight, function)).get();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这仍然适用于Pair<String,Double>从 a 中获取 a Map<String, List<Double>>,但可以做更多的事情\xe2\x80\xa6

\n