第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Java 中使用 Stream 和 BinaryOperator 的斐波那契

在 Java 中使用 Stream 和 BinaryOperator 的斐波那契

有只小跳蛙 2022-10-07 16:22:20
我是學(xué)生,正在學(xué)習(xí)函數(shù)式 Java 8。我有項目要做,但我不明白這個函數(shù)接口是如何工作的。我的老師告訴我“你應(yīng)該知道這一點”,我正在尋求幫助來理解這個問題。它應(yīng)該計算斐波那契數(shù)列我得到了這個代碼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)));    }}有人可以幫助我并解釋如何解決這個問題?
查看完整描述

2 回答

?
夢里花落0921

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]));

    }

}


查看完整回答
反對 回復(fù) 2022-10-07
?
30秒到達(dá)戰(zhàn)場

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


查看完整回答
反對 回復(fù) 2022-10-07
  • 2 回答
  • 0 關(guān)注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號