2017-07-03 99 views
2

我有一個包含字符串和字符串列表的流,我想把所有值作爲字符串列表出來。 無論如何要做一些流操作?從流中獲取字符串列表

Stream stream = Stream.of("v1", Arrays.asList("v2, v3")); 
+3

這裏的流在哪裏? –

+0

當你說流過來時,你是什麼意思?你想得到什麼? –

+2

爲什麼不使用'l.addAll(Arrays.asList(「v2」,「v3」))',並輸入'l'作爲'List '? – Nathan

回答

6

通常情況下,您不會混淆列表中的這些不同類型,但您可以從中獲得所需的結果;每個單個字符串可以轉換爲一個字符串的流,每個字符串列表可以轉換爲多個字符串的流;那麼flatMap會將所有流平整爲一個字符串流。

List<String> strings = l.stream() 
     .flatMap(o -> { 
       if (o instanceof List) { 
        return ((List<String>) o).stream(); 
       } 
       return Stream.of((String) o); 
      }) 
     .collect(Collectors.toList()); 

你會得到一個unchecked cast的警告,但這是你在不同類型的容器中混合使用的警告。

+0

您可以通過添加一個'if(o instanceof String)'no來移除警告嗎? – Nathan

+0

@Nathan否,警告是從鑄造到'(列表)',因爲Java將無法驗證泛型類型。 'instanceof'將不起作用。 – khelwood

+0

好吧,這是我的解決方案,想現在如果我可以跳過instanceof – poyger

2

您想要在對象列表上使用流,然後根據對象的性質做一些事情。要做到這一點,你可以使用Khelwood's answer。但你很可能是更好的使用是這樣的:

List<String> l = new ArrayList<>(); 
l.add("v1"); 
l.addAll(Arrays.asList("v2","v3")); 
3

如果你想避免「未登記」的警告,你要投的每個元素,當你執行它作爲一個後續的每件工作,其效果最好,的flatMap步驟中,當單個String元件和List實例已經均勻地處理後:

List<Object> list = new ArrayList<>(); 
list.add("v1"); 
list.add(Arrays.asList("v2","v3")); 

List<String> strings = list.stream() 
    .flatMap(o -> o instanceof List? ((List<?>)o).stream(): Stream.of(o)) 
    .map(String.class::cast) 
    .collect(Collectors.toList()); 

但是,如已經被別人說,在第一位置不具有這種混合型列表,是更好的選擇。