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

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

具有已知界限的 Java Stream 最小值

具有已知界限的 Java Stream 最小值

紫衣仙女 2023-07-19 16:49:47
我有一個列表流,我想獲取其中元素最少的條目。我當然可以做類似的事情Stream<List<T>> s = ...s.min((e1, e2) -> e1.size() - e2.size());但在這種情況下,我們知道最小值的下界,因為大小是非負的。這意味著當找到大小為 0 的列表時,我們實際上可以停止,而不是也遍歷列表的其余部分。使用 Java Streams 可以以一種不錯的方式實現這一點嗎?我想象它看起來像這樣,給出一個比較器和一個函數,告訴我們當前最小值何時是全局最小值:s.boundedMin(    (e1, e2) -> e1.size() - e2.size(),    e -> e.size() == 0)我想不出一種方法來實現這一點。當然,我可以只使用 Iterable 并使用帶有break語句的循環來實現這一點,我只是想知道流是否也可以讓我到達那里。編輯:為了讓它更清楚一點。該流可能包含也可能不包含大小為 0 的列表。我的問題是 min() 將遍歷整個流,即使它已經找到大小為 0 的列表(它已經盡可能小了)。因此,我正在尋找的是min 的實現,它不需要通過提供最小值的下界來掃描整個流。Edit2:沒有流的等效迭代解決方案是List<List<T>> s = ...List<T> min = null;for (List<T> l : s) {        if (min == null || min.size() > l.size())            min = l;        if (min.size() == 0) {            break;        }}
查看完整描述

1 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

就是圖個好玩兒:


static <T> int size(Stream<List<T>> st) {


    class MinHolder implements Consumer<List<T>> {


        private int min = Integer.MAX_VALUE;


        public void accept(List<T> l) {

            if (min > l.size()) {

                min = l.size();

            }

        }

    }


    MinHolder holder = new MinHolder();

    Spliterator<List<T>> sp = st.spliterator();


    int elements = 0;

    for (; sp.tryAdvance(holder) && holder.min > 0; ++elements) {


    }


    System.out.printf("took %s elements to find the min%n", elements);

    return holder.min;

}

以及一些測試用例:


public static void main(String[] args) {

    Stream<List<Integer>> st = Stream.of(List.of());

    System.out.println(size(st));


    st = Stream.empty();

    System.out.println(size(st));


    st = Stream.of(List.of(), List.of(1), List.of(1, 2), List.of(1, 2, 3));

    System.out.println(size(st));

}

如果你不是被迫使用 a,Stream<List<T>>那么就不要使用;這種條件中斷并不是 Streams 的設計初衷,許多人會認為這是一種濫用。


查看完整回答
反對 回復 2023-07-19
  • 1 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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