java - 如何在函数式接口(interface)的直接声明中专门化类型?

标签 java

最近我想出了创建以下方法的想法:

/** Returns a {@link Predicate} which tests whether all its elements match a condition passed as argument. */
private static <T> Predicate<Iterable<T>> allIterableElementsMatch(Predicate<T> elementMatchCondition) { 
    return iterable -> stream(iterable).allMatch(elementMatchCondition);
}

然后我决定声明 Function-field 而不是声明上面的方法。
我可以提供的最接近的无法编译解决方案是:

private static final Function<Predicate<?>, Predicate<Iterable<?>>> allIterableElementsMatch = 
    condition -> iterable -> stream(iterable).allMatch(condition);

由于以下原因,此代码未编译(IDE 突出显示 allMatch(...) 内的 condition):

我的问题:

  1. 它可以通过这种方式实现吗?还是我只是误解了使用函数式接口(interface)的概念?
  2. 是否可以在 Function-s 声明中专门化某些类型,就像我展示的方法一样?

最佳答案

对于类型系统,?来自Predicate<?>?来自Predicate<Iterable<?>>是不同的东西。你可以这样做:

private static <T> Function<Predicate<T>, Predicate<Iterable<T>>> func() {
    return condition -> iterable -> StreamSupport.stream(iterable.spliterator(), false).allMatch(condition);
}

关于java - 如何在函数式接口(interface)的直接声明中专门化类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64936012/

相关文章:

java - 循环突然结束并且Java不保存对象?

java - 创建 Servlet Cookie

java - 在 Java 中比较两个 float 和舍入(Big Java Ex 5.3)

Java Applet 缓冲图像

java - 无法从 Android 应用程序登录 Twitter。获取电子邮件时出现 TwitterException

java - 将循环结果放入数组后如何使用 ArrayList 和 For 循环?

java - JPA:通过外键引用的表的另一个字段进行索引

java - Spring Data JPA 通过嵌入对象属性查找

java - DatabaseReference 的 setValue() 方法是否有一次调用中可以写入的最大子级数?

java - Java 有什么好的多方法实现吗?