2 回答

TA貢獻(xiàn)1772條經(jīng)驗 獲得超6個贊
要使第一個示例工作,您需要實現(xiàn)以下內(nèi)容:
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]));
}
}
它從您的輸入流創(chuàng)建數(shù)組,然后將傳遞的函數(shù)應(yīng)用于兩個元素,將前一次迭代的結(jié)果轉(zhuǎn)移到 position 0,因為我們需要前兩個值來計算下一個。然后它創(chuàng)建無限的計算斐波那契元素流。
輸出是:
1
1
2
3
5
8
13
并且具有正確泛型用法的版本,因為您的初始結(jié)構(gòu)會產(chǎn)生原始類型。
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]));
}
}要使第一個示例工作,您需要實現(xiàn)以下內(nèi)容:
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]));
}
}
它從您的輸入流創(chuàng)建數(shù)組,然后將傳遞的函數(shù)應(yīng)用于兩個元素,將前一次迭代的結(jié)果轉(zhuǎn)移到 position 0,因為我們需要前兩個值來計算下一個。然后它創(chuàng)建無限的計算斐波那契元素流。
輸出是:
1
1
2
3
5
8
13
并且具有正確泛型用法的版本,因為您的初始結(jié)構(gòu)會產(chǎn)生原始類型。
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貢獻(xiàn)1828條經(jīng)驗 獲得超6個贊
我假設(shè)擁有超過 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)) 等,其中 + 是二元運算符。
基本上你把流變成一個數(shù)組,然后你使用Stream.generate并在每一步生成你擁有的元素之后的元素,將數(shù)組左移以適應(yīng)新元素,并返回舊的第一個元素(它不再在數(shù)組中)。請注意,由于這有副作用(修改外部數(shù)組),它不能與.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
添加回答
舉報