亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何根據比較連續的列表元素將 Java 流減少為布爾值

如何根據比較連續的列表元素將 Java 流減少為布爾值

千巷貓影 2023-05-17 14:36:19
作為重構練習,我正在嘗試采用以下方法:    for (int i = 1; i < orderedList.size(); i++) {        Object object1 = ordered.get(i - 1);        Object object2 = ordered.get(i);        if (isDifferent(object1, object2)) return true;    }    return false;變成一個簡單的 Java 函數語句。乍一看,我正在按順序處理列表的元素,reduce()聽起來很有希望,但是它需要攜帶一個布爾值,這讓我失去了前一個元素;或者攜帶列表的前一個元素,這意味著我需要將它放在某種包裝器對象中,或者笨拙地使用Optional或另一個List作為包裝器,以便跟蹤我是否有區別。所以,我看到了可以使用 reduce 操作的方法,但它會比原來的 for 循環更復雜、更難理解。我看著創建一個自定義收集器,但遇到了同樣的問題。這是對 reduce 的正確使用,還是因為我知道我可以使用它來處理前一次迭代的順序值而受到誘惑?如果使用得當,我該如何編寫函數以將自己簡化為布爾值?感謝您對這個思維練習的幫助。
查看完整描述

3 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

因為您正在使用Listfor 循環為兩個 s 編制索引,所以您可以將其替換為 anIntStream并將其縮減為IntStream#anyMatch

return?IntStream.range(1,?orderedList.size())
????????????????.anyMatch(i?->?isDifferent(ordered.get(i?-?1),?ordered.get(i)));

雖然,我并沒有真正看到這提供了多少好處,所以將它保留為 for 循環可能更具可讀性。


查看完整回答
反對 回復 2023-05-17
?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

這里的基本操作稱為“壓縮”:給定兩個流As 和Bs 以及一個組合運算符(A, B) -> C,您可以創建一個 s 流C(截斷為較短的輸入流)。假設你有這樣的功能


<A, B, C> Stream<C> zip

?(Stream<? extends A> as, Stream<? extends B> bs,

? BiFunction<? super A, ? super B, ? extends C> combine);

您可以將您的操作實現為


zip(ordered.stream(), ordered.stream().skip(1), this::isDifferent).anyMatch(x -> x);

// ordered: a b c d ... y z

// skipped: b c d ... y z

// zipped : (a, b) (b, c) (c, d) ... (y, z)

zip標準庫中沒有。如果您使用的是像 Guava 這樣的東西,您可以檢查它是否有這個操作,或者,您可以自己實現它并將其粘貼到某個實用程序類中,我將重現那里列出的代碼(它似乎是從實際 Streams API 的測試版抄襲而來):

public static<A, B, C> Stream<C> zip(Stream<? extends A> a,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Stream<? extends B> b,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?BiFunction<? super A, ? super B, ? extends C> zipper) {

? ? Objects.requireNonNull(zipper);

? ? Spliterator<? extends A> aSpliterator = Objects.requireNonNull(a).spliterator();

? ? Spliterator<? extends B> bSpliterator = Objects.requireNonNull(b).spliterator();


? ? // Zipping looses DISTINCT and SORTED characteristics

? ? int characteristics = aSpliterator.characteristics() & bSpliterator.characteristics() &

? ? ? ? ? ? ~(Spliterator.DISTINCT | Spliterator.SORTED);


? ? long zipSize = ((characteristics & Spliterator.SIZED) != 0)

? ? ? ? ? ? ? Math.min(aSpliterator.getExactSizeIfKnown(), bSpliterator.getExactSizeIfKnown())

? ? ? ? ? ? : -1;


? ? Iterator<A> aIterator = Spliterators.iterator(aSpliterator);

? ? Iterator<B> bIterator = Spliterators.iterator(bSpliterator);

? ? Iterator<C> cIterator = new Iterator<C>() {

? ? ? ? @Override

? ? ? ? public boolean hasNext() {

? ? ? ? ? ? return aIterator.hasNext() && bIterator.hasNext();

? ? ? ? }


? ? ? ? @Override

? ? ? ? public C next() {

? ? ? ? ? ? return zipper.apply(aIterator.next(), bIterator.next());

? ? ? ? }

? ? };


? ? Spliterator<C> split = Spliterators.spliterator(cIterator, zipSize, characteristics);

? ? return (a.isParallel() || b.isParallel())

? ? ? ? ? ?? StreamSupport.stream(split, true)

? ? ? ? ? ?: StreamSupport.stream(split, false);

}


查看完整回答
反對 回復 2023-05-17
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

按照你的邏輯不就是這么簡單嗎?


return orderedList.stream.distinct().count() != 1; // assuming that you have equals and 

                                                  //  hashcode method overridden for 

                                                  // your object.


查看完整回答
反對 回復 2023-05-17
  • 3 回答
  • 0 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號