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

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

如果流中的流為空,如何記錄消息?

如果流中的流為空,如何記錄消息?

Helenr 2023-03-17 15:03:48
給定以下 Java 8 流:scheduleService.list().stream()                      .filter(Schedule::getEnabled)                      .filter(this::runnable)                      .flatMap(s -> s.getJobs().stream())                      // .doSomethingArbitrary(System.out.println("A single message. The total number of                       // elements in the stream after filtering is " + this::count))                      .forEach(this::invoke);在對流應(yīng)用過濾并應(yīng)用第一個終端操作之后,如果流為空,我想記錄一條調(diào)試消息,如果不是,我想在流中的每個元素上調(diào)用該方法invoke。這可能嗎?
查看完整描述

4 回答

?
暮色呼如

TA貢獻(xiàn)1853條經(jīng)驗 獲得超9個贊

您可以創(chuàng)建自定義Collector(此處稱為StreamInterceptor),即使這并不真正符合收藏家的目的。


自定義收集器將做什么?

  1. 轉(zhuǎn)換Stream<T>List<T>

  2. 調(diào)用 Consumer<List>,在您的情況下它將打印列表的長度。

  3. 返回一個新Stream<T>List<T>

主要方法

在這里,我剛剛將您的問題分解為過濾一個簡單的字符串列表,并在最后將它們打印到控制臺。

    public static void main(String[] args) {

        List<String> myList = List.of("first", "second", "third");

        myList.stream()

                .filter(string -> !string.equals("second"))

                .collect(printCount())

                .forEach(System.out::println);

    }


    /**

     * Creates a StreamInterceptor, which will print the length of the stream 

     */

    private static <T> StreamInterceptor<T> printCount() {

        Consumer<List<T>> listSizePrinter = list -> System.out.println("Stream has " + list.size() + " elements");

        return new StreamInterceptor<>(listSizePrinter);

    }

初始化時,StreamInterceptor您可以定義一個消費者,它接收從流構(gòu)造的中間列表并對其執(zhí)行一些操作。在您的情況下,它只會打印列表的大小。


新StreamInterceptor班級

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import java.util.Set;

import java.util.function.*;

import java.util.stream.Collector;

import java.util.stream.Stream;


class StreamInterceptor<T> implements Collector<T, List<T>, Stream<T>> {


    private final Consumer<List<T>> listConsumer;


    public StreamInterceptor(Consumer<List<T>> listConsumer) {

        this.listConsumer = listConsumer;

    }


    @Override

    public Supplier<List<T>> supplier() {

        return ArrayList::new;

    }


    @Override

    public BiConsumer<List<T>, T> accumulator() {

        return List::add;

    }


    @Override

    public BinaryOperator<List<T>> combiner() {

        return (list1, list2) -> {

            list1.addAll(list2);

            return list1;

        };

    }


    @Override

    public Function<List<T>, Stream<T>> finisher() {

        return list -> {

            listConsumer.accept(list);

            return list.stream();

        };

    }


    @Override

    public Set<Characteristics> characteristics() {

        return Collections.emptySet();

    }

}



查看完整回答
反對 回復(fù) 2023-03-17
?
婷婷同學(xué)_

TA貢獻(xiàn)1844條經(jīng)驗 獲得超8個贊

您可以peek在將列表轉(zhuǎn)換為stream.


public static void main(String[] args) {

    Stream.of(Arrays.asList(1, 2, 3), Arrays.asList(4, 5), Collections.emptyList())

            .filter(x -> x.size() % 2 == 0)

            .peek(s -> System.out.println(s.isEmpty()))

            .flatMap(Collection::stream)

            .forEach(System.out::println);

}

輸出


false

4

5

true


查看完整回答
反對 回復(fù) 2023-03-17
?
富國滬深

TA貢獻(xiàn)1790條經(jīng)驗 獲得超9個贊

這根本不是真正的“好”,但您可以使用 peek 查看您的流并設(shè)置一個 AtomicBoolean:


AtomicBoolean empty = new AtomicBoolean(true);


scheduleService.list().stream()

                      .filter(Schedule::getEnabled)

                      .filter(this::runnable)

                      .flatMap(s -> s.getJobs().stream())

                      .peek(s -> ab.set(false);)

                      .forEach(this::invoke);


if(empty.get()){

   // is Empty

}


查看完整回答
反對 回復(fù) 2023-03-17
?
千萬里不及你

TA貢獻(xiàn)1784條經(jīng)驗 獲得超9個贊

您可以將您包裝Stream成如下所示的自定義方法


Stream<???> stream = scheduleService.list().stream()

                                           .filter(Schedule::getEnabled)

                                           .filter(this::runnable)

                                           .flatMap(s -> s.getJobs().stream());


forEachOrElse(stream, this::invoke, () -> System.out.println("The stream was empty"));

隨著forEachOrElse存在


public <T> void forEachOrElse(Stream<T> inStream, Consumer<T> consumer, Runnable orElse) {

    AtomicBoolean wasEmpty = new AtomicBoolean(true);

    inStream.forEach(e -> {

        wasEmpty.set(false);

        consumer.accept(e);

    });


    if (wasEmpty.get())

        orElse.run();

}

我現(xiàn)在無法測試它,但它應(yīng)該會發(fā)揮它的魔力


查看完整回答
反對 回復(fù) 2023-03-17
  • 4 回答
  • 0 關(guān)注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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