如果满足某些条件,如何申请收集器?
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
?
问题是merge
returns一个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的中间积累类型
和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);
我有一些方法可以合并 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
?
问题是merge
returns一个String
和收集器一个List<String>
。你不能将两者合二为一。您需要使用像
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的中间积累类型
和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);