2016-11-15 795 views
3

我想從字符串列表中刪除空字符串。Java 8 - 從List中過濾空字符串不工作

這裏是我的嘗試,使用流API:

list.stream().filter(item-> !item.isEmpty()).collect(Collectors.toList()); 

和空字符串仍然存在在列表中。我錯過了什麼?

+0

是不是'字符串:: isEmpty'? – Tschallacka

+0

你是否將返回值分配給某個變量? – ItamarG3

+3

你不想保留*不*爲空的項目嗎?你只保留空的。 –

回答

11

filter()保持匹配謂詞的元素。 Soyou需要逆謂詞:

list.stream().filter(item-> !item.isEmpty()).collect(Collectors.toList()); 

這也不會修改原始列表。它將創建原始列表的過濾副本。因此,你需要

list = list.stream().filter(item-> !item.isEmpty()).collect(Collectors.toList()); 

如果要修改原來的列表中,你應該使用

list.removeIf(item -> item.isEmpty()); 

或者乾脆

list.removeIf(String::isEmpty); 
+0

我錯過了!在問題中。我的問題是我沒有保持結果。我雖然該過濾器()修改原來的列表。 – stackUnderflow

0

您正在刪除非空字符串(請檢查您的過濾條件)。嘗試:

list.stream().filter(item -> !item.isEmpty()).collect(Collectors.toList()); 

否則,你可能需要檢查你刪除空格以及:

list.stream().filter(item -> !item.trim().isEmpty()).collect(Collectors.toList()); 
2

也許字符串中包含空格?替換item -> item.isEmpty()item -> !item.trim().isEmpty()

2

我懷疑你不保留結果。結果被返回,原始列表不會被更改,因爲這是函數式編程風格。

list = list.stream().filter(item-> !item.trim().isEmpty()).collect(Collectors.toList()); 
0

你是不是從列表中刪除空字符串,你是檢索它們。你的過濾條件是錯誤的。

嘗試這樣的:

List<String> collect = list.stream().filter(item -> !item.trim().isEmpty()).collect(Collectors.toList()); 
1

你正在收集空元素:)

你想要的不是空的,所以反轉謂語

List<String> xxx = list.stream().filter(item -> !item.isEmpty()).collect(Collectors.toList()); 

此外,該流不被修改原始列表,所以Collect(Collectrors.toList())正在返回謂詞的結果:)

+0

他正在收集空的元素,然後忘記他們:) – TheLostMind

+1

啊真正如此:)好眼睛! –

+0

tnxs @TheLostMind –

0

你可以按照下面的例子,它可以幫助你

String[] firstArray = {"test1", "", "test2", "test4", "", null}; 

    firstArray = Arrays.stream(firstArray).filter(s -> (s != null && s.length() > 0)).toArray(String[]::new); 
0
 <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-lang3</artifactId> 
      <version>3.5-SNAPSHOT</version> 
     </dependency> 

import org.apache.commons.lang3.StringUtils; 
     //Java8 new api 
     strings.removeIf(StringUtils::isBlank); 
     //stream  strings=strings.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());