无法使用我定义的方法提供Stream.iterate方法

时间:2017-12-17 15:04:51

标签: lambda java-8 functional-programming

我喜欢创建易于理解的代码。我也不想经常重复我的代码。 今天我正在尝试增加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;
}
}

2 个答案:

答案 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表示对单个操作数的操作   生成与其操作数相同类型的结果。这是一个   函数的特化用于操作数和结果的情况   属于同一类型。