- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用以下方法(以及其他方法)编写实用程序类:
class FunctionNamingUtils {
public static <T> Consumer<T> named(String name, Consumer<T> delegate) {
class NamedConsumer implements Consumer<T> {
@Override public void accept(T t) { delegate.accept(t); }
@Override public String toString() { return name; }
}
return new NamedConsumer();
}
public static <T, R> Function<T, R> named(String name, Function<T, R> delegate) {
class NamedFunction implements Function<T, R> {
@Override public R apply(T t) { return delegate.apply(t); }
@Override public String toString() { return name; }
}
return new NamedFunction();
}
}
编译器提示:
Warning: java: named(java.lang.String,java.util.function.Consumer) in ... is potentially ambiguous with named(java.lang.String,java.util.function.Function) in ...
我确实明白警告的目的 - 根据 lambda 返回值还是 void 我们将采用一种方式或另一种方式,并且对于难以看到的单语句 lambda。
问题是,在这种情况下,这正是我们想要的,我想使用重载来减少必须记住相同功能的两个方法名称的认知负担(我已经不得不妥协与 boolean 函数冲突的 namedPredicate
。
我正在寻找任何想法 - 关于抑制警告或以不同方式表达 API。重点是客户端的清晰度和易用性。
我只关心 Java 8+。
最佳答案
实际上,我对 lambda 的理解并不完整。事实证明,任何返回值的 lambda 都可以合法地用于 void lambda 的位置。
引自errorprone/FunctionalInterfaceClash
JLS 15.12.2.1 says that lambdas whose body is a statement expression are compatible with functional interfaces whose function type is void-returning or value returning:
A lambda expression (§15.27) is potentially compatible with a functional interface type (§9.8) if all of the following are true:
The arity of the target type’s function type is the same as the arity of the lambda expression. If the target type’s function type has a void return, then the lambda body is either a statement expression
- (§14.8) or a void-compatible block (§15.27.2). If the target type’s function type has a (non-void) return type, then the lambda body is either an expression or a value-compatible block (§15.27.2).
换句话说,考虑到上面的实现,传递一个消费者和一个函数式 lambda 会解决得很好,但是有一个用例,我们想要使用一个实际返回值的 lambda 来实现一个消费者。
例如这两个会失败:
Functions.named(name, Objects::requireNonNull);
Functions.named(name, it -> Objects.requireNonNull(it));
为了让它工作,我们需要像这样添加显式语句 block :
Functions.named(name, it -> { Objects.requireNonNull(it); });
虽然这是一个边缘案例,我可以在 API 中记录它,但这改变了可读性权衡,所以现在我将方法重命名为:
Functions.fun(name, delegate)
Functions.con(name, delegate)
Functions.pre(name, delegate)
Functions.sup(name, delegate)
虽然不如对所有内容都使用 named
好,但它仍然可读且一致。
我简要考虑了 namedFunction
样式名称,但考虑到这些名称在代码库中的使用频率,我宁愿让它们更简洁。
关于java - 回避 javac "ambiguous"重载方法的警告,这些方法仅因参数 lambda 是 void 还是 non-void 而不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40957359/
可以使用 lambda 和函数创建有序对(Lisp 中的缺点),如 Use of lambda for cons/car/cdr definition in SICP 所示。 它也适用于 Python
我正在尝试从另一个调用一个 AWS lambda 并执行 lambda 链接。这样做的理由是 AWS 不提供来自同一个 S3 存储桶的多个触发器。 我创建了一个带有 s3 触发器的 lambda。第一
根据以下源代码,常规 lambda 似乎可以与扩展 lambda 互换。 fun main(args: Array) { val numbers = listOf(1, 2, 3) f
A Tutorial Introduction to the Lambda Calculus 本文介绍乘法函数 The multiplication of two numbers x and y ca
我想弄清楚如何为下面的表达式绘制语法树。首先,这究竟是如何表现的?看样子是以1和2为参数,如果n是 0,它只会返回 m . 另外,有人可以指出解析树的开始,还是一个例子?我一直找不到一个。 最佳答案
在 C++0x 中,我想知道 lambda 函数的类型是什么。具体来说: #include type1 foo(int x){ return [x](int y)->int{return x * y
我在其中一个职位发布中看到了这个问题,它询问什么是 lambda 函数以及它与高阶函数的关系。我已经知道如何使用 lambda 函数,但不太自信地解释它,所以我做了一点谷歌搜索,发现了这个:What
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
Evaluate (((lambda(x y) (lambda (x) (* x y))) 5 6) 10) in Scheme. 我不知道实际上该怎么做! ((lambda (x y) (+ x x
我正在处理 MyCustomType 的实例集合如下: fun runAll(vararg commands: MyCustomType){ commands.forEach { it.myM
Brian 在他对问题 "Are side effects a good thing?" 的论证中的前提很有趣: computers are von-Neumann machines that are
在 Common Lisp 中,如果我希望两个函数共享状态,我将按如下方式执行 let over lambda: (let ((state 1)) (defun inc-state () (in
Evaluate (((lambda(x y) (lambda (x) (* x y))) 5 6) 10) in Scheme. 我不知道实际上该怎么做! ((lambda (x y) (+ x x
作为lambda calculus wiki说: There are several possible ways to define the natural numbers in lambda cal
我有一个数据类,我需要初始化一些 List .我需要获取 JsonArray 的值(我使用的是 Gson)。 我做了这个函数: private fun arrayToList(data: JsonAr
((lambda () )) 的方案中是否有简写 例如,代替 ((lambda () (define x 1) (display x))) 我希望能够做类似的事情 (empty-lam
我在 Java library 中有以下方法: public void setColumnComparator(final int columnIndex, final Comparator colu
我正在研究一个函数来计算国际象棋游戏中棋子的有效移动。 white-pawn-move 函数有效。当我试图将其概括为任一玩家的棋子 (pawn-move) 时,我遇到了非法函数调用。我已经在 repl
考虑这段代码(在 GCC 和 MSVC 上编译): int main() { auto foo = [](auto p){ typedef decltype(p) p_t;
我正在阅读一个在 lambda 内部使用 lambda 的片段,然后我想通过创建一个虚拟函数来测试它,该函数从文件中读取然后返回最大和最小数字。 这是我想出来的 dummy = lambda path
我是一名优秀的程序员,十分优秀!