您是不是有 Java 8 功能接口列表(不是 java.util.function 中列出的接口)?

Posted

技术标签:

【中文标题】您是不是有 Java 8 功能接口列表(不是 java.util.function 中列出的接口)?【英文标题】:Do you have a list of Java 8 Functional interfaces (not the ones listed in java.util.function)?您是否有 Java 8 功能接口列表(不是 java.util.function 中列出的接口)? 【发布时间】:2017-03-22 03:43:45 【问题描述】:

我正在尝试查看是否有任何方法可以获取 Java 8 中作为功能接口的所有接口的列表。我不是在谈论此页面上的列表:

https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

相反,我说的是 Comparator、FileFilter 和 Runnable 等接口 - API 文档显示的接口功能如下:

@FunctionalInterface 公共接口可运行

在某处是否有这些的完整列表?

谢谢!

【问题讨论】:

【参考方案1】:

当您浏览到FunctionalInterface’s class documentation 并单击顶部的USE 链接时,API 文档中会列出所有使用@FunctionalInterface 注释的接口。

但必须强调的是注解的存在是not mandatory to make an interface a functional interface。每个接口只有一个 abstract 方法与 java.lang.Objectpublic 方法不匹配,可以通过 lambda 表达式或方法引用来实现,尽管这并不一定意味着结果将满足为特定 @ 指定的附加契约987654332@.

有roughly 200 interfaces in the JRE fulfilling the technical constraints,所以当你尝试通过 lambda 表达式实现它们时,编译器不会反对。只有少数人有注释。一些没有注释的人仍然可以顺利工作,例如ActionListenerInvocationHandlerThreadFactory,而其他的则由于诸如 ComparableProtocolFamilyFlavorException 等额外限制而不适用。这也在“Why isn't @FunctionalInterface used on all the interfaces in the JDK that qualify?”中进行了讨论

因此,虽然@FunctionalInterface 记录了可用作 lambda 表达式或方法引用的目标类型的意图,但其他接口类型可能仍适用于相同目的,但您必须自己调查合同以确定是否使用合适。

【讨论】:

【参考方案2】:

使用@GhostCat's Eclipse方法,这里是运行时库中标记为@FunctionalInterface的接口的实际列表,不包括java.util.function.*

java.awt.KeyEventDispatcher
java.awt.KeyEventPostProcessor
java.io.FileFilter
java.io.FilnameFilter
java.lang.Runnable
java.lang.Thread.UncaughtExceptionHandler
java.nio.file.DirectoryStream.Filter
java.nio.file.PathMatcher
java.time.temporal.TemporalAdjuster
java.time.temporal.TemporalQuery
java.util.Comparator
java.util.concurrent.Callable
java.util.logging.Filter
java.util.prefs.PreferenceChangeListener
jdk.management.resource.ResourceApprover
jdk.management.resource.ResourceId

【讨论】:

这两种想法中的哪一种?我猜是 Eclipse? 如果你是 Jon Skeet,你会自己编写搜索工具(当然是更复杂的)。 唉。不,没有人会到达那里。 是的...这可能是 *** 系统的问题...即使他不再活着,他仍然可能每天获得 200 分...任何挑战者都将获得 200 分大多数......所以......可能需要几十年的时间,直到他的答案不再有效(甚至被否决?),但挑战者的那些仍然需要保持最新。但谁知道呢。也许由于他在世时的努力,社区正在为他的答案做出贡献,他们会建造雕像和类似的东西;-) @Roland 没那么简单。例如,当您查看本季度时,您会发现 Jon 在该排名中“仅”位于第 14 位。头号人物比乔恩多收集 10K。而那个***的戈登只比乔恩落后 40 万。因此,在他到达 Jon 今天的位置之前,还有 40 个季度。上联;等一下。并且只是为了记录:我设法进入前 30 名左右。请放心:这是一项非常艰巨的工作。但你也是对的:Jon 能够从他无数的帖子中收集到很多“感兴趣的”。他有一个可爱的头像。【参考方案3】:

解决方法:例如,您可以使用 eclipse 来收集这样的列表。

只需跳转到该注释的来源,然后在全局范围内搜索其用法。

或者,您可以使用反射并编写代码来扫描某个 JAR 中的所有类,以检查每个类是否正在使用该注释。这需要一些努力,但我认为没有任何重大障碍。这只是坐下来做。

当然,真正的答案可能是:这可能是一个 xy 问题;我们更应该关注你认为你需要知道的“为什么”。

【讨论】:

反射对于另一个目的会更有用:它(可能)是找到没有明确标记注释的有效功能接口的唯一方法。当然,这需要对类层次结构、默认方法、Object 方法等进行更复杂的分析。 同意。还有关于这种“扩展”搜索程序的复杂性。 …或者您转到official API documentation,浏览到FunctionalInterface,然后单击顶部的USE link。这真的很容易…… 那是超级kewl。我实际上去了javadoc ...但是在我的手机上;我没有看到那个链接。所以我假设注释(与类/接口相反)没有“在这里使用”的信息!科尔。你应该这样回答! @Elisabeth:请记住the annotation is not required for a functional interface。 JRE 中大约有 200 个接口满足技术约束,因此当您尝试通过 lambda 表达式实现它们时,编译器不会反对。只有少数人有注释。尽管没有注释,但其中一些工作顺利,例如ActionListener, InvocationHandler, or ThreadFactory, 其他的不适合Comparable, ProtocolFamily, FlavorException。另见this question...【参考方案4】:

为了完整起见,这里列出了可以通过 lambda 表达式或方法引用实现的所有 JRE 接口,尽管以这种方式实现时,并非所有这些接口都是有用的或语义正确的。此列表不包括 JavaFX 等扩展 API。

java.awt.ActiveEvent java.awt.Composite java.awt.KeyEventDispatcher java.awt.KeyEventPostProcessor java.awt.PrintGraphics java.awt.Stroke java.awt.Transparency java.awt.datatransfer.ClipboardOwner java.awt.datatransfer.FlavorListener java.awt.dnd.DragGestureListener java.awt.dnd.DragSourceMotionListener java.awt.event.AWTEventListener java.awt.event.ActionListener java.awt.event.AdjustmentListener java.awt.event.HierarchyListener java.awt.event.ItemListener java.awt.event.MouseWheelListener java.awt.event.TextListener java.awt.event.WindowStateListener java.awt.image.ImageObserver java.awt.image.TileObserver java.awt.image.renderable.RenderedImageFactory java.awt.print.Printable java.awt.print.PrinterGraphics java.beans.ExceptionListener java.beans.PropertyChangeListener java.beans.VetoableChangeListener java.beans.beancontext.BeanContextChildComponentProxy java.beans.beancontext.BeanContextContainerProxy java.beans.beancontext.BeanContextProxy java.beans.beancontext.BeanContextServiceRevokedListener java.io.Closeable java.io.FileFilter java.io.FilenameFilter java.io.Flushable java.io.ObjectInputValidation java.lang.AutoCloseable java.lang.Comparable java.lang.Iterable java.lang.Readable java.lang.Runnable java.lang.Thread.UncaughtExceptionHandler java.lang.instrument.ClassFileTransformer java.lang.management.PlatformManagedObject java.lang.reflect.GenericArrayType java.lang.reflect.InvocationHandler java.net.ContentHandlerFactory java.net.CookiePolicy java.net.DatagramSocketImplFactory java.net.FileNameMap java.net.ProtocolFamily java.net.SocketImplFactory java.net.URLStreamHandlerFactory java.nio.file.DirectoryStream.Filter java.nio.file.PathMatcher java.nio.file.WatchEvent.Modifier java.nio.file.attribute.AttributeView java.nio.file.attribute.FileAttributeView java.nio.file.attribute.FileStoreAttributeView java.rmi.activation.ActivationInstantiator java.rmi.activation.Activator java.rmi.server.RMIClientSocketFactory java.rmi.server.RMIFailureHandler java.rmi.server.RMIServerSocketFactory java.rmi.server.Unreferenced java.security.DomainCombiner java.security.Guard java.security.KeyStore.LoadStoreParameter java.security.PrivilegedAction java.security.PrivilegedExceptionAction java.security.cert.CertPathParameters java.security.cert.CertPathValidatorResult java.security.cert.CertStoreParameters java.security.interfaces.DSAKey java.security.interfaces.ECKey java.security.interfaces.RSAKey java.security.spec.ECField java.sql.DriverAction java.time.chrono.Era java.time.temporal.TemporalAdjuster java.time.temporal.TemporalQuery java.util.Formattable java.util.Observer java.util.concurrent.Callable java.util.concurrent.Executor java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory java.util.concurrent.RejectedExecutionHandler java.util.concurrent.ThreadFactory java.util.function.BiConsumer java.util.function.BiFunction java.util.function.BiPredicate java.util.function.BinaryOperator java.util.function.BooleanSupplier java.util.function.Consumer java.util.function.DoubleBinaryOperator java.util.function.DoubleConsumer java.util.function.DoubleFunction java.util.function.DoublePredicate java.util.function.DoubleSupplier java.util.function.DoubleToIntFunction java.util.function.DoubleToLongFunction java.util.function.DoubleUnaryOperator java.util.function.Function java.util.function.IntBinaryOperator java.util.function.IntConsumer java.util.function.IntFunction java.util.function.IntPredicate java.util.function.IntSupplier java.util.function.IntToDoubleFunction java.util.function.IntToLongFunction java.util.function.IntUnaryOperator java.util.function.LongBinaryOperator java.util.function.LongConsumer java.util.function.LongFunction java.util.function.LongPredicate java.util.function.LongSupplier java.util.function.LongToDoubleFunction java.util.function.LongToIntFunction java.util.function.LongUnaryOperator java.util.function.ObjDoubleConsumer java.util.function.ObjIntConsumer java.util.function.ObjLongConsumer java.util.function.Predicate java.util.function.Supplier java.util.function.ToDoubleBiFunction java.util.function.ToDoubleFunction java.util.function.ToIntBiFunction java.util.function.ToIntFunction java.util.function.ToLongBiFunction java.util.function.ToLongFunction java.util.function.UnaryOperator java.util.logging.Filter java.util.prefs.PreferenceChangeListener java.util.spi.ResourceBundleControlProvider javax.accessibility.Accessible javax.activation.CommandObject javax.activation.DataContentHandlerFactory javax.imageio.IIOParamController javax.imageio.event.IIOReadWarningListener javax.imageio.event.IIOWriteWarningListener javax.imageio.metadata.IIOMetadataController javax.imageio.spi.ServiceRegistry.Filter javax.management.DescriptorRead javax.management.NotificationFilter javax.management.NotificationListener javax.management.openmbean.CompositeDataView javax.management.remote.JMXAddressable javax.management.remote.JMXAuthenticator javax.management.remote.JMXConnectorProvider javax.management.remote.JMXConnectorServerProvider javax.naming.NameParser javax.naming.Referenceable javax.naming.event.NamingListener javax.naming.ldap.HasControls javax.naming.spi.InitialContextFactory javax.naming.spi.InitialContextFactoryBuilder javax.naming.spi.ObjectFactory javax.naming.spi.ObjectFactoryBuilder javax.naming.spi.StateFactory javax.net.ssl.HandshakeCompletedListener javax.net.ssl.HostnameVerifier javax.print.FlavorException javax.print.event.PrintJobAttributeListener javax.print.event.PrintServiceAttributeListener javax.security.auth.callback.CallbackHandler javax.sound.midi.ControllerEventListener javax.sound.midi.MetaEventListener javax.sound.sampled.LineListener javax.sql.RowSetReader javax.sql.RowSetWriter javax.swing.JComboBox.KeySelectionManager javax.swing.ListCellRenderer javax.swing.Painter javax.swing.UIDefaults.ActiveValue javax.swing.UIDefaults.LazyValue javax.swing.event.CaretListener javax.swing.event.ChangeListener javax.swing.event.HyperlinkListener javax.swing.event.ListSelectionListener javax.swing.event.RowSorterListener javax.swing.event.TableModelListener javax.swing.event.TreeSelectionListener javax.swing.event.UndoableEditListener javax.swing.table.TableCellRenderer javax.swing.text.Highlighter.HighlightPainter javax.swing.text.Position javax.swing.text.TabExpander javax.swing.text.ViewFactory javax.swing.tree.RowMapper javax.swing.tree.TreeCellRenderer javax.tools.DiagnosticListener javax.tools.OptionChecker javax.xml.bind.ValidationEventHandler javax.xml.crypto.KeySelectorResult javax.xml.crypto.NodeSetData javax.xml.crypto.URIDereferencer javax.xml.crypto.XMLStructure javax.xml.stream.EventFilter javax.xml.stream.StreamFilter javax.xml.stream.XMLReporter javax.xml.stream.XMLResolver javax.xml.stream.util.XMLEventConsumer javax.xml.transform.URIResolver javax.xml.ws.AsyncHandler javax.xml.ws.Provider javax.xml.ws.handler.HandlerResolver javax.xml.xpath.XPathFunction javax.xml.xpath.XPathFunctionResolver javax.xml.xpath.XPathVariableResolver org.omg.CORBA.DomainManagerOperations org.omg.CORBA.portable.InvokeHandler org.omg.CORBA.portable.ValueBase org.omg.CORBA.portable.ValueFactory org.omg.IOP.CodecFactoryOperations org.omg.PortableInterceptor.PolicyFactoryOperations org.omg.PortableServer.AdapterActivatorOperations org.w3c.dom.DOMErrorHandler org.w3c.dom.UserDataHandler org.w3c.dom.events.DocumentEvent org.w3c.dom.events.EventListener org.w3c.dom.ls.LSResourceResolver org.w3c.dom.views.AbstractView org.w3c.dom.views.DocumentView org.xml.sax.EntityResolver

【讨论】:

【参考方案5】:

这是@FunctionalInterface的“使用”页面的链接:Uses of Class @FunctionalInterface

以下是所有常用且语义中性的,连同它们的参数和返回类型一起列出。

此处提供完整列表:List of Functional Interfaces (programming.guide)

Runnable → BiConsumer<T, U> T, U → BiFunction<T, U, R> T, U → R BinaryOperator<T> T, T → T BiPredicate<T, U> T, U → 布尔值 BooleanSupplier → 布尔值 Consumer<T>T → DoubleBinaryOperator 双倍,双倍 → 双倍 DoubleConsumer双→ DoubleFunction<R>双→R DoublePredicate double → boolean DoubleSupplier → 双倍 DoubleToIntFunction double → int DoubleToLongFunction double → long DoubleUnaryOperator双→双 Function<T, R> T → R IntBinaryOperator int → int IntConsumer int → IntFunction<R> int → R IntPredicate int → boolean IntSupplier → int IntToDoubleFunction int → double IntToLongFunction int → long IntUnaryOperator int → int LongBinaryOperator长长→长 LongConsumer长→ LongFunction<R>长→R LongPredicate long → 布尔值 LongSupplier → 长 LongToDoubleFunction long → double LongToIntFunction long → int LongUnaryOperator长→长 ObjDoubleConsumer<T>T, 双 → ObjIntConsumer<T> T, int → ObjLongConsumer<T>T,长→ Predicate<T> T → 布尔值 Supplier<T> → T ToDoubleBiFunction<T, U> T, U → 双 ToDoubleFunction<T>T→双 ToIntBiFunction<T, U> T, U → int ToIntFunction<T>T → int ToLongBiFunction<T, U> T, U → 长 ToLongFunction<T>T→长 UnaryOperator<T>T→T

【讨论】:

以上是关于您是不是有 Java 8 功能接口列表(不是 java.util.function 中列出的接口)?的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D 是不是允许您使用 Java 进行编码?

确定一个列表是不是由 Java 8 中的字谜元素组成

检查自定义对象列表是不是与 Java 8 中的属性具有相同的值

在 Java 9 中是不是有充分的理由使用带有新接口的抽象类? [复制]

8 python 抽象类

java中判断一个对象是不是实现了某个接口