我喜欢创建一个易于理解的代码。我也不想经常重复我的代码。今天我正在尝试增加我的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;
}
}
问题是方法引用不评估为一元运算符。一元运算符不返回一元运算符。在您的上下文中,它应该采用并返回一个整数。它的返回类型是一元运算符。
我相信如果你改变了第二个参数它会编译:
Stream<Integer> numStream = Stream.iterate(0, Main.provideExpression());
如果你想使用方法引用,那么给它一个一元运算符的签名:
public static int provideExpression(int n) {
return n + 1;
}
此版本方法的引用将是一元运算符。
因为你的provideExpression
函数不尊重UnaryOperator
的契约,因为它没有参数,也没有返回与它的参数相同的类型(自定义函数当前没有)。
相反,您的自定义函数应定义为:
public static int provideExpression(int input) {
return input + 1;
}
因为java doc说明:
UnaryOperator表示对单个操作数的操作,该操作产生与其操作数相同类型的结果。对于操作数和结果属于同一类型的情况,这是Function的特化。