gpt4 book ai didi

java - 如果流中的流为空,如何记录消息?

转载 作者:搜寻专家 更新时间:2023-11-01 03:45:45 24 4
gpt4 key购买 nike

给定以下 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);

在对流应用过滤并应用第一个终端操作后,如果流为空,我想记录一条调试消息,否则,调用 invoke 流中每个元素的方法。这可能吗?

最佳答案

您可以创建自定义 Collector (此处称为 StreamInterceptor ),尽管这并不真正符合 Collection 家的目的。


自定义收集器会做什么?

  1. 转换 Stream<T>List<T>
  2. 调用 Consumer ,在您的情况下它将打印列表的长度。
  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 时您可以定义一个消费者,它接收从流构造的中间列表并对其执行一些操作。在您的情况下,它只会打印列表的大小。

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

资源

关于java - 如果流中的流为空,如何记录消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56976797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com