相关疑难解决方法(0)

什么是Java中的"SAM类型"?

阅读Java-8规范,我不断看到对"SAM类型"的引用.我无法找到明确解释这是什么.

什么是SAM类型以及什么是何时可以使用的示例场景?

java lambda java-8

116
推荐指数
1
解决办法
3万
查看次数

Java 8方法签名不一致

Java 8为我们提供了具有如此长签名的新方法:

static <T,K,U,M extends Map<K,U>> Collector<T,?,M> toMap(
    Function<? super T,? extends K> keyMapper, 
    Function<? super T,? extends U> valueMapper, 
    BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
Run Code Online (Sandbox Code Playgroud)

我发现奇怪的是,通配符已用于确保前两个参数尽可能通用,但第三个参数只是一个BinaryOperator<U>.如果它们一致,那肯定会是一个BiFunction<? super U,? super U,? extends U>?我错过了什么吗?有没有充分的理由,或者他们只是想避免使已经可怕的签名更糟糕?

编辑

我理解PECS,并且我理解mergeFunction应该被认为是一种获取两个U并且取回一个的方法的原则U.然而,能够拥有可以以许多不同方式重用的对象将是有用的.例如:

static final BiFunction<Number, Number, Double> 
        MULTIPLY_DOUBLES = (a, b) -> a.doubleValue() * b.doubleValue();
Run Code Online (Sandbox Code Playgroud)

显然这不是一个BinaryOperator<Double>,但它可以被视为一个.这将是巨大的,如果你能使用MULTIPLY_DOUBLESBiFunction<Number, Number, Double>BinaryOperator<Double>,根据上下文.特别是,您可以简单地传递MULTIPLY_DOUBLES以指示您希望double使用乘法减少s 的负载.但是toMap(Java 8中的其他新方法)的签名不允许这种灵活性.

java java-8

10
推荐指数
1
解决办法
666
查看次数

标签 统计

java ×2

java-8 ×2

lambda ×1