如果某些条件成立,如何申请收藏家?

时间:2017-10-13 12:06:49

标签: java java-8 collectors

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

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

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

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

我想制作一个List<String>,其中包含lst flag == falsemerge(lst) flag == true中的所有元素。我想写一些可以这样做的收藏家。

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

有没有办法简明扼要地制作这样的Collector

1 个答案:

答案 0 :(得分:1)

问题在于merge会返回String而收集器会返回List<String>。你不能将两者合二为一。您需要使用自定义容器类,如

public class Container {
    List<String> onePossibleResult;
    String otherPossibleResult;
}

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

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

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

其中:

  • R - 结果的类型
  • A - 收集器的中间累积类型

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