如何使用Java8编写函数的泛型迭代? 请考虑以下两个功能: public static <X, Y, U, V extends X> Function<U, Y> composite( Function<X, Y> first, Function<U, V> second) { Objects.requireNonNull(first); Objects.requireNonNull(second); return (U arg) -> first.apply(second.apply(arg)); } public static <X, Y extends X> Function<X, ?> iterate(Function<X, Y> function, int n) { if (n < 0) return null; if (n == 0) return (X arg) -> arg; Objects.requireNonNull(function); Function<X, Y> iteration = function; for (; n > 1; --n) iteration = composite(function, iteration); return iteration; }

如何使用Java8编写函数的泛型迭代? 请考虑以下两个功能: public static <X, Y, U, V extends X> Function<U, Y> composite( Function<X, Y> first, Function<U, V> second) { Objects.requireNonNull(first); Objects.requireNonNull(second); return (U arg) -> first.apply(second.apply(arg)); } public static <X, Y extends X> Function<X, ?> iterate(Function<X, Y> function, int n) { if (n < 0) return null; if (n == 0) return (X arg) -> arg; Objects.requireNonNull(function); Function<X, Y> iteration = function; for (; n > 1; --n) iteration = composite(function, iteration); return iteration; },java,generics,java-8,functor,Java,Generics,Java 8,Functor,这将产生错误消息: Type mismatch: cannot convert from Function<Double,capture#2-of ?> to Function<Double,Double> 类型不匹配:无法从函数转换为函数 这里最好的选择是什么?如果n==1,我们可以检查X是否可以接受为Y。我想听听其他选项和一些如何执行此检查的想法(据我所知,没有简单的解决方案来检查两个通用参数是否相等) 试试看: public static<X> Un

这将产生错误消息:

Type mismatch: cannot convert from Function<Double,capture#2-of ?> to Function<Double,Double>
类型不匹配:无法从函数转换为函数
这里最好的选择是什么?如果
n==1
,我们可以检查
X
是否可以接受为
Y
。我想听听其他选项和一些如何执行此检查的想法(据我所知,没有简单的解决方案来检查两个通用参数是否相等)

试试看:

public static<X> UnaryOperator<X> iterate(UnaryOperator<X> f, int n) { ... }
公共静态一元运算符迭代(一元运算符f,int n){…}

如果Y您需要更改结果的类型以考虑通配符:

Function<Double, ? extends Double> nthSquareRoot = iterate(Math::sqrt, 2);
例如:

public static <X, Y extends X> Function<X, ? extends X> iterate(Function<X, Y> function, int n) {
  if (n < 0) return null;
  if (n == 0) return Function.identity();

  Function<X, Y> iteration = Objects.requireNonNull(function);
  for (; n > 1; --n) {
    iteration = composite(function, iteration);
  }
  return iteration;
}

public static void main(String[] args) {
  Function<Double, ? extends Double> nthSquareRoot = iterate(Math::sqrt, 2);
  System.out.println(nthSquareRoot.apply(81d));
}

嗯。。。在Java8中有,为什么不使用它?@fge谢谢。你说得对,我应该使用
函数.compose
。然而,这并不能解决我的问题。
public static <X, Y extends X> Function<X, ? extends X> iterate(Function<X, Y> function, int n)
public static <X, Y extends X> Function<X, ? extends X> iterate(Function<X, Y> function, int n) {
  if (n < 0) return null;
  if (n == 0) return Function.identity();

  Function<X, Y> iteration = Objects.requireNonNull(function);
  for (; n > 1; --n) {
    iteration = composite(function, iteration);
  }
  return iteration;
}

public static void main(String[] args) {
  Function<Double, ? extends Double> nthSquareRoot = iterate(Math::sqrt, 2);
  System.out.println(nthSquareRoot.apply(81d));
}
public static <X> UnaryOperator<X> iterate(UnaryOperator<X> function, int n) {
  if (n < 0) return null;
  if (n == 0) return UnaryOperator.identity();

  UnaryOperator<X> iteration = Objects.requireNonNull(function);
  for (int i = 0; i < n - 1; i++) {
    iteration = composite(function::apply, iteration::apply)::apply;
  }
  return iteration;
}

public static void main(String[] args) {
  UnaryOperator<Double> nthSquareRoot = iterate(Math::sqrt, 2);
  System.out.println(nthSquareRoot.apply(81d));
}