我有一些方法可以合并List并生成String
:
private static String merge(List<String> strs){
// do some and return some String
}
我也有一些列表和一些布尔标志:
boolean flag = //..
List<String> lst = //...
我想制作一个List<String>
,其中包含lst
flag == false
和merge(lst)
flag == true
中的所有元素。我想写一些可以这样做的收藏家。
lst.stream().collect(
//Here I want Collectors.toList, or apply merge if flag == true
)
有没有办法简明扼要地制作这样的Collector
?
答案 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
- 收集器的中间累积类型 T
是Stream<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);