是否存在表示 instanceof 运算符的现有谓词?

Enz*_*ion 2 java java-8

我正在使用 Java 8 的 lambda 表达式来分区列表(使用.collect(Collectors.partitioningBy(...))),我需要我的分区标准是元素是否是给定类的实例。

做如下工作

list.stream().collect(Collectors.partitioningBy(elt -> elt instanceof EltType))
Run Code Online (Sandbox Code Playgroud)

但是是否存在InstanceOf可以通过方法引用使用的现有“ ”谓词?

Mic*_*ael 8

是的,你可以使用 Class::isInstance

此方法是 Java 语言instanceof 运算符的动态等效项

例子

list.stream().collect(Collectors.partitioningBy(EltType.class::isInstance))
Run Code Online (Sandbox Code Playgroud)

  • OP是否询问如何通过方法引用来实现他们的逻辑?我一定是错过了。 (2认同)
  • @GyroGearless“简洁”和“惯用”并不相同。“elt -> elt instanceof EltType”和“EltType.class::isInstance”都不比另一个更惯用。当您将 elt 重命名为 e 时,您甚至不能说其中一个比另一个更简洁。顺便说一句,“e -> e instanceof EltType”是一个无状态 lambda,最终将成为单例,而“EltType.class::isInstance”将捕获“Class”对象,因此,尽管可能与直觉相矛盾,不过,方法引用的效率可能较低,这在实践中存在微小的差异。 (2认同)