如果列表不为空,是否可以使用.collect(Collectors.toList())
收集到列表,然后将整个列表(不像.forEach
东西)传递给某些使用者或函数?我不想声明一个列表变量以将其传递给我的下一个方法,并为此使用大括号。
答案 0 :(得分:2)
您似乎正在考虑按照以下方式做些事情:
someMethod(...collect(Collectors.toList()));
但是只有在传递的列表不为空的情况下才调用someMethod
,同时避免使用if
语句和临时变量。
实际上是不可能在传入数据时阻止方法调用。
您的选择受到限制,如下所示:
someMethod
之前,将列表存储到一个临时变量中,检查!tempList.isEmpty()
是否正确,然后使用列表调用该方法,否则不执行任何操作。someMethod
中进行处理,如果列表为空,则立即使用return;
退出该方法,如果它是一个void
返回方法,则抛出异常或返回一些异常表示无法处理列表的值。答案 1 :(得分:0)
假设您有以下两种方法:
private boolean canConsumeList(List<?> list) {
return !list.isEmpty();
}
private <T> void consumeNonEmptyList(List<T> nonEmptyList) {
// logic here
}
您可以像这样“入侵” Collector
API:
public final class ExtraCollectors {
public static <T, R> Collector<T, ?, ?> collectingAndConsuming(Collector<T, ?, R> downstream, Predicate<R> resultFilter, Consumer<R> resultConsumer) {
return Collectors.collectingAndThen(downstream, result -> {
if (resultFilter.test(result)) {
resultConsumer.accept(result);
}
return null;
});
}
}
,然后按如下所示使用它:
Stream.of("a", "b").collect(ExtraCollectors.collectingAndConsuming(
Collectors.toList(), this::canConsumeList, this::consumeNonEmptyList
));
但是请注意,这种解决方案不是我认为的“干净代码”(这就是为什么我称其为“ hack”)的原因。对于其他开发人员来说,这可能是不直观的,因为collect
与获得某些结果(或者换句话说,将Stream
的元素“收集”到单个结果中)并存。而且这里没有任何结果(甚至我的IDE都抱怨“ Stream.collect()
的结果被忽略了”)。