Java8哈希映射

Java8哈希映射,java,java-8,java-stream,Java,Java 8,Java Stream,我有一张地图map你可以试试这个: public static Pair<String,Double> getKeyValue(Map<String,List<Double>> map, BinaryOperator<Double> function) { return map.entrySet().stream() .map(e -> new Pair<String,Double

我有一张地图
map你可以试试这个:

public static Pair<String,Double> getKeyValue(Map<String,List<Double>> map,
        BinaryOperator<Double> function) {
        return map.entrySet().stream()
            .map(e -> new Pair<String,Double>(e.getKey(),e.getValue().stream().reduce(function).get()))
            .reduce((p1,p2) -> function.apply(p1.getValue(),p2.getValue()).equals(p1.getValue()) ? p1 : p2)
            .get();
}
公共静态对getKeyValue(映射,
二进制运算符(函数){
返回map.entrySet().stream()
.map(e->新对(e.getKey(),e.getValue().stream().reduce(函数).get()))
.reduce((p1,p2)->function.apply(p1.getValue(),p2.getValue()).equals(p1.getValue())?p1:p2)
.get();
}
说明:


首先,将每个
条目
关联到一个
,其中值是列表的最小值(或最大值),且键保持不变,然后比较每个
,以找到具有最低(或最高)值的一个。

二进制运算符
不是该任务的良好规范,直接在还原中使用它来生成适当的值,例如最小值或最大值,但是它不适合返回相关值,如
映射的键值。以这种方式使用它意味着实现必须执行额外的操作,以找出
BinaryOperator
在缩减过程中为了选择正确的键值实际上做了什么。更糟糕的是,它不能保证
BinaryOperator
执行允许执行这种缩减的操作,例如,该运算符可能返回一个既不是其参数也不是其参数的值

对于这样的任务,
比较器
是更好的选择,因为它设计用于指定排序并执行相关操作,如查找最大值和最小值。实现可能如下所示:

public static Pair<String,Double> getMinimumKeyValue(
    Map<String, List<Double>> map, Comparator<Double> function) {

    return map.entrySet().stream()
        .map(e->new Pair<>(e.getKey(), e.getValue().stream().min(function).get()))
        .min(Comparator.comparing(Pair::getRight, function)).get();
}

这仍然适用于从
映射中获取
,但可以做更多…

您在装箱的
上使用
=
,这似乎不太可能按预期工作。我倾向于尝试远离
BinaryOperator
方法,更喜欢
Comparator
…没错,但我会将测试更改为
a.equals(b)
来解决它。谢谢你注意到这一点!我真的看不懂这个。也许是语法、缺少的成对文本等等,但我在阅读Haskell时遇到的问题较少。一般来说,函数式方法的可读性通常比Java中简单的旧样式低得多。与其他完全为集成函数式编程而设计的语言相比,Java函数式样式有点冗长。关于Java中缺少元组语法的说法是正确的,这将使代码更加清晰。嘎!不要使用Optional.get,如果地图为空,它将抛出。使用其中一种安全方法,如ifPresent、orElse或orelsetrow。
public static <K,V> Pair<K,V> getMinKeyValue(
    Map<K, ? extends Collection<V>> map, Comparator<? super V> function) {

    return map.entrySet().stream()
        .map(e->new Pair<>(e.getKey(), e.getValue().stream().min(function).get()))
        .min(Comparator.comparing(Pair::getRight, function)).get();
}