如果满足某些条件,如何申请收集器?

How to apply collector if some condition holds?

我有一些方法可以合并 List 并生成 String:

private static String merge(List<String> strs){
    // do some and return some String
}

我还有一些列表和一些布尔标志:

boolean flag = //..
List<String> lst = //...

我想生成一个 List<String>,它包含 lst if flag == false 中的所有元素和 merge(lst) if flag == true 中的所有元素。我想写一些可以这样做的收集器。

lst.stream().collect(
   //Here I want Collectors.toList, or apply merge if flag == true
)

有没有办法简洁地制作这样的Collector

问题是mergereturns一个String和收集器一个List<String>。你不能将两者合二为一。您需要使用像

这样的自定义容器 class
public class Container {
    List<String> onePossibleResult;
    String otherPossibleResult;
}

然后您还需要创建一个能够处理该自定义 Container 的自定义 Collector。我怀疑您会发现 简洁.

下一个问题是您的 merge 函数需要 List<String> 而不是 Stream<String>String。但是在你想要应用它的时候,在 collect 方法中,你会收到 String 个元素:

lst.stream().collect(Collector<? super T,A,R> collector);

其中:

  • R - 结果的类型
  • A - Collector的中间积累类型

TStream<T>中包含的元素的类型,所以在这种情况下是String,而不是List<String>


我会简单地包装一个 if-else,这只会增加 3 行代码:

if (flag) {
    String mergeResult = merge(lst);
} else {
    List<String> collectResult = lst.stream().collect(Collectors.toList);
}

请注意,else-case 只是生成同一列表的副本,您可以简单地这样做:

List<String> collectResult = new ArrayList<>(str);