问题标签 [functional-interface]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 为什么比较器声明等于?
Comparator 接口有自己的equals()
方法。默认情况下,任何类都将equals()
通过 Object 类获得。equals()
接口内部需要有什么方法?
java - Java 8 中“函数式接口”的精确定义
最近我开始探索 Java 8,我不太了解 Java 实现 lambda 表达式所必需的“函数式接口”的概念。在 Java 中有一个非常全面的 lambda 函数指南,但我卡在了定义函数接口概念的那一章。定义如下:
更准确地说,函数式接口被定义为只有一个抽象方法的任何接口。
然后他继续举例,其中一个是Comparator
接口:
我能够测试我可以使用 lambda 函数代替 Comparator 参数并且它可以工作(即Collections.sort(list, (a, b) -> a-b)
)。
但是在 Comparator 接口中,方法compare
和equals
方法都是抽象的,这意味着它有两个抽象方法。那么,如果定义需要一个接口只有一个抽象方法,这怎么能工作呢?我在这里想念什么?
java - Java 8 - 功能接口与抽象类
我在探索 Java 8 的特性时遇到了“Functional Interface”。
据我了解,这些接口可以有一些默认实现的方法:
但我的疑问是,这就是抽象类的用途。
为什么要引入功能接口。
performance - 什么时候使用函数式接口?(Java 8)
我最近转而为 Java 8 开发我的软件,我一直在慢慢改进我对 Java 8 的使用并熟悉 Java 8,在这样做的过程中,我开始实现越来越多的功能接口,最近 NetBeans 已经开始建议我将一些 for 循环换成功能接口,但从程序运行的方式来看,它似乎比简单地使用 for 循环慢得多(分别为 1.9 秒运行时与 0.9 秒)。所以我的问题是——是否值得使用功能接口代替 for 循环?一般来说,什么时候应该使用功能接口?功能接口在其他方面是否更有效?提前致谢。
java - 方法引用的通用功能接口的方法签名
假设你有一个方法
Consumer
通过使用新的方法引用,您可以从中创建一个
如果您现在通过反射查看创建的 Consumer 的类,您会看到它唯一声明的方法是
如果通过创建匿名内部类以旧方式创建消费者
会有桥接法void accept(Object)
以及void accept(String)
.
现在假设我们必须传递这个消费者,从而失去它的泛型类型。如果你有一个实现Consumer<String>
而不是 Lambda 表达式,你可以通过使用 relfection 来访问它的方法来取回它。由于通过方法引用创建的消费者只有通用方法,所以这不起作用。有没有办法获取方法引用创建的消费者的参数类型?
java - Java 8 streams, why does this compile part 2... Or what is a method reference, really?
OK, the first question in this "series" was this one.
Now, here is another case:
This compiles, and works...
OK, in the last question, static methods from a class were used.
But now this is different: System.out
is a static
field of System
, yes; it is also a PrintStream
, and a PrintStream
has a println()
method which happens to match the signature of a Consumer
in this case, and a Consumer
is what forEach()
expects.
So I tried this...
And it works!
This is quite a different scope here, since I initiate a new instance and can use a method reference right after this instance is constructed!
So, is a method reference really any method which obeys the signature? What are the limits? Are there any cases where one can build a "@FunctionalInterface compatible" method which cannot be used in a @FunctionalInterface
?
java - 如何在静态助手类中声明功能接口?
鉴于我已经存在以下结构:
其中FileUtils.readAndModifyFileEntry
声明为:
现在我想将一个将字符串值作为整数加一的运算符移动到一个新的辅助类中,我提出了两个建议:
哪个更好,用法如下:
相对
还是我应该保留两者?
后者的优点之一是我可以用andThen()
or链接运算符compose()
,但它有什么缺点吗?
如需更多参考,我可以使用以下内容:
手动将其转换为操作员,但它确实看起来很难看。但是,如果我同时提供两者,它是否会在代码库上创建不需要的方法爆炸?
java - 是否可以声明供应商需要抛出异常吗?
所以我试图重构以下代码:
我想出了以下开始:
但是,它不能编译(显然),因为Supplier
不能抛出IOException
. 有什么办法可以将它添加到的方法声明中getFromConfig
?
还是像下面这样的唯一方法?
更新,我刚刚意识到Supplier
接口是一个非常简单的接口,因为它只有get()
方法。我扩展的最初原因Supplier
是为了破坏基本功能,例如默认方法。
java-8 - 为什么 Java 8 的 ToIntFunction 没有扩展功能
如果我编写了 ToIntFunction 接口,我想在接口中编码它只是一个返回原始 int 的函数,如下所示:
我想知道,Java 8 API 设计者选择将原始替代方案与 Function 完全分开是否有令人信服的理由?是否有证据表明他们考虑这样做并决定反对?我想类似的问题至少适用于其他一些“特殊”功能接口,如消费者(可能是 Function<T,Void>)和供应商(Function<Void,T>)。
我还没有深入和彻底地考虑过这一切的后果,所以我可能遗漏了一些东西。
如果 ToIntFunction(和其他原始通用函数接口)与 Function 有这种关系,它将允许在需要 Function 参数的地方使用它(想到的是与其他函数的组合,例如调用 myFunction.compose(myIntFunction)或者避免在 API 中编写几个专门的函数时,如上所述的这种自动(取消)装箱实现就足够了)。
这与这个问题非常相似:Why doesn't Java 8's Predicate<T> extend Function<T, Boolean>但我意识到由于语义原因,答案可能有所不同。因此,我正在为这种简单的原始替代函数的情况重新制定问题,其中不能有任何语义,只有原始类型与包装类型,甚至消除了 null 包装对象的可能性。
java - Is there a way to turn an existing interface into a functional interface?
I am using an interface that looks something along the lines of this:
And I am currently using an anonymous class to implement the interface, but I don't care about one of the two methods. Something along the lines of this:
Now, I've been using the new lambda expressions in Java 8 wherever I'm able, and I would like to use the added simplicity in a situation like this. After all, I'm only implementing one of the methods, but since there are two methods in the interface, I can't use it in a lambda expression.
Is there a way for me to get around this restriction?