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

问题描述 投票:1回答:2

我喜欢创建一个易于理解的代码。我也不想经常重复我的代码。今天我正在尝试增加我的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;
}
}
lambda java-8 functional-programming
2个回答
3
投票

问题是方法引用不评估为一元运算符。一元运算符不返回一元运算符。在您的上下文中,它应该采用并返回一个整数。它的返回类型是一元运算符。

我相信如果你改变了第二个参数它会编译:

Stream<Integer> numStream = Stream.iterate(0, Main.provideExpression());

如果你想使用方法引用,那么给它一个一元运算符的签名:

public static int provideExpression(int n) { 
    return  n + 1; 
}

此版本方法的引用将是一元运算符。


0
投票

因为你的provideExpression函数不尊重UnaryOperator的契约,因为它没有参数,也没有返回与它的参数相同的类型(自定义函数当前没有)。

相反,您的自定义函数应定义为:

public static int provideExpression(int input) {
       return input + 1;
}

因为java doc说明:

UnaryOperator表示对单个操作数的操作,该操作产生与其操作数相同类型的结果。对于操作数和结果属于同一类型的情况,这是Function的特化。

© www.soinside.com 2019 - 2024. All rights reserved.