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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

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);在對(duì)流應(yīng)用過(guò)濾并應(yīng)用第一個(gè)終端操作之后,如果流為空,我想記錄一條調(diào)試消息,如果不是,我想在流中的每個(gè)元素上調(diào)用該方法invoke。這可能嗎?
查看完整描述

4 回答

?
暮色呼如

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

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


自定義收集器將做什么?

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

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

  3. 返回一個(gè)新Stream<T>List<T>

主要方法

在這里,我剛剛將您的問(wèn)題分解為過(guò)濾一個(gè)簡(jiǎn)單的字符串列表,并在最后將它們打印到控制臺(tái)。

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

    }

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


新StreamInterceptor班級(jí)

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

    }

}



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

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

您可以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


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

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

這根本不是真正的“好”,但您可以使用 peek 查看您的流并設(shè)置一個(gè) 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

}


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

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

您可以將您包裝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)在無(wú)法測(cè)試它,但它應(yīng)該會(huì)發(fā)揮它的魔力


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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