java - 在 Java 中使用 Stream 和 BinaryOperator 的 Fibonacci

标签 java lambda java-8 java-stream functional-interface

我是学生,正在学习函数式 Java 8。我有项目要做,但我不明白这个函数接口(interface)是如何工作的。我的老师告诉我“你应该知道”,我正在寻求帮助来理解这个问题。应该算斐波那契数列

我得到了这个代码

StreamUtils.generateRest(Stream.of(1, 1), (a, b) -> a + b)
    .limit(7)
    .forEach(System.out::println);

StreamUtils.generateRest(Stream.of("AAA", "BB", "KKKK"), (a, b) -> a + b)
    .limit(7)
    .forEach(System.out::println);

StreamUtils.generateRest(Stream.of(i -> 0), 
    (BinaryOperator<UnaryOperator<Integer>>) (f, g) -> (x -> x == 0 ? 1 : x * g.apply(x - 1)))
    .limit(10)
    .map(f -> f.apply(7))
    .forEach(System.out::println);

我做了类似的事情,但它不起作用

public class StreamUtils<T> {

    public static <T> Stream generateRest(Stream<T> stream, BinaryOperator<T> binaryOperator) {
        return Stream.of(stream.reduce((a, b) -> binaryOperator.apply(a, b)));
    }

}

有人可以帮助我并解释如何解决这个问题吗?

最佳答案

要使第一个示例工作,您需要实现如下内容:

private static class StreamUtils<T> {
    public static <T> Stream generateRest(Stream<T> stream, BinaryOperator<T> binaryOperator) {
        return Stream.iterate(stream.toArray(), p -> new Object[]{p[1], binaryOperator.apply((T) p[0], (T) p[1])})
            .flatMap(p -> Stream.of(p[0]));
    }
}

它从您的输入流创建数组,然后将传递的函数应用于两个元素,将上一次迭代的结果移动到位置 0,因为我们需要前两个值来计算下一个。 然后它会创建无限的计算斐波纳契元素流。

输出是:

1
1
2
3
5
8
13

以及具有正确泛型用法的版本,因为您的初始结构会生成原始类型。

private static class StreamUtils {
    public static <T> Stream<T> generateRest(Stream<T> stream, BinaryOperator<T> binaryOperator) {
        return Stream.iterate(stream.toArray(), p -> new Object[]{p[1], binaryOperator.apply((T) p[0], (T) p[1])})
            .flatMap(p -> Stream.of((T) p[0]));
    }
}

关于java - 在 Java 中使用 Stream 和 BinaryOperator 的 Fibonacci,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55693325/

相关文章:

java - MongoDB Java Driver 4.1.1 如何配置超时设置

java - 生成字母表中所有字母数组的更好方法

c# - 表达式树依赖分析器

java - 将列表映射到 Map Java 8 stream 和 groupingBy

java - 在 Java 中解析字符串

java - 与 Instagram 相比,CameraPreview 显示的是放大后的图像

python - 检查两个 Python 函数是否相等

c# - 通过表达式树从嵌套类获取静态字段

方法参数的Java可选?

Java 8 Streams,部分工作作为并行流执行,另一部分作为顺序流执行