2 回答
TA贡献1772条经验 获得超6个赞
要使第一个示例工作,您需要实现以下内容:
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]));
}
}
它从您的输入流创建数组,然后将传递的函数应用于两个元素,将前一次迭代的结果转移到 position 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]));
}
}要使第一个示例工作,您需要实现以下内容:
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]));
}
}
它从您的输入流创建数组,然后将传递的函数应用于两个元素,将前一次迭代的结果转移到 position 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]));
}
}
TA贡献1828条经验 获得超6个赞
我假设拥有超过 2 个项目意味着 A、B、C、A+B、B+C、C+(A+B)、(A+B)+(B+C) 等,并且具有1 项表示 A、A+A、A+(A+A)、(A+A)+(A+(A+A)) 等,其中 + 是二元运算符。
基本上你把流变成一个数组,然后你使用Stream.generate并在每一步生成你拥有的元素之后的元素,将数组左移以适应新元素,并返回旧的第一个元素(它不再在数组中)。请注意,由于这有副作用(修改外部数组),它不能与.parallel().
@SuppressWarnings("unchecked")
public static <T> Stream<T> generateRest(Stream<T> stream, BinaryOperator<T> binaryOperator) {
T[] t = (T[]) stream.toArray();
if (t.length == 1) {
t = (T[]) new Object[] { t[0], binaryOperator.apply(t[0], t[0]) };
}
final T[] items = t;
return Stream.generate(() -> {
T first = items[0];
T next = binaryOperator.apply(items[0], items[1]);
System.arraycopy(items, 1, items, 0, items.length - 1);
items[items.length - 1] = next;
return first;
});
}
输出:
1
1
2
3
5
8
13
AAA
BB
KKKK
AAABB
BBKKKK
KKKKAAABB
AAABBBBKKKK
0
0
0
0
0
0
0
0
5040
5040
添加回答
举报