我喜欢创建易于理解的代码。我也不想经常重复我的代码。 今天我正在尝试增加Java中的函数编程技能,我遇到了以下问题:
作为第一步,我尝试使用Iterate()方法生成流。一切都很好,底部的代码在我使用时起作用:
Stream<Integer> numStream = Stream.iterate(0, x -> x +1);
然而,当我尝试使用我定义的方法时。
Stream<Integer> numStream = Stream.iterate(0, Main::provideExpression);
我的IDE说: Stream类型中的方法iterate(T,UnaryOperator)不适用于参数(int,Main :: provideExpression
你能不能请大家告诉我这里做错了什么?谢谢!完整代码:
class Main {
public static void main(String[] args) {
Stream<Integer> numStream = Stream.iterate(0, Main::provideExpression);
List<Integer> squareNumbers = numStream.map(Main::power).limit(100).collect(Collectors.toList());
printFormated(squareNumbers);
}
public static UnaryOperator<Integer> provideExpression() {
return n -> n + 1;
}
public static <T> void printFormated(Collection<T> collection) {
collection.forEach(x -> System.out.println(x + " ; "));
}
public static int power(int x) {
return x * x;
}
}
答案 0 :(得分:3)
问题是方法引用不评估为一元运算符。一元运算符不返回一元运算符。在您的上下文中,它应该采用并返回一个整数。它的返回类型是一元运算符。
我相信如果你改变了第二个参数它会编译:
Stream<Integer> numStream = Stream.iterate(0, Main.provideExpression());
如果你想使用方法参考,那么给它一个一元运算符的签名:
public static int provideExpression(int n) {
return n + 1;
}
此方法版本的引用将是一元运算符。
答案 1 :(得分:0)
原样,你的provideExpression
函数不尊重UnaryOperator
的契约,因为它没有参数,也没有返回与它的参数相同的类型(自定义函数)目前还没有。)
相反,您的自定义函数应定义为:
public static int provideExpression(int input) {
return input + 1;
}
因为java doc声明:
UnaryOperator表示对单个操作数的操作 生成与其操作数相同类型的结果。这是一个 函数的特化用于操作数和结果的情况 属于同一类型。