2017-10-13 68 views
0

我有一些方法,它可以合并列表和生产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)如果​​。我想写一些可以这样做的收藏家。

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

有没有办法来简明工艺等Collector

+0

你有没有试着写您的自定义'Collector'([文件](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collector.html))?如果是这样,你能分享你的问题在哪里吗? – Zabuza

+0

@Zabuza我的问题是关于一个简洁的方式?编写自定义收集器对于这种情况似乎过分。 –

+0

我没有得到这个问题。你说你想调用Collectors.toList或merge,但它们不会返回相同的类型。 – senerh

回答

1

问题是merge返回String和收集器a 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); 
+3

老实说,我没有看到''else''语句中的原因,你只是收集相同的列表。或者我错过了什么? –

+2

@SchiduLuca是的,我认为是的,这是一个副本。然而这是OP要求的:'*这里我想要Collectors.toList *'。但是你强调这一点很好。 – Zabuza

+2

@SchiduLuca它不是__同一列表,它是一个副本。但我同意'new ArrayList <>(lst);'会更有意义/更具可读性。 – Tom