2017-07-08 41 views
3

我有String(S)的List,但我想它轉換成一個Map<String, Boolean>List<String>,使所有設置爲boolean映射。我有以下代碼。創建映射出字符串(S)與流的列表

import java.lang.*; 
import java.util.*; 
class Main { 
    public static void main(String[] args) { 
    List<String> list = new ArrayList<>(); 
    list.add("ab"); 
    list.add("bc"); 
    list.add("cd"); 
    Map<String, Boolean> alphaToBoolMap = new HashMap<>(); 
    for (String item: list) { 
     alphaToBoolMap.put(item, true); 
    } 
    //System.out.println(list); [ab, bc, cd] 
    //System.out.println(alphaToBoolMap); {ab=true, bc=true, cd=true} 
    } 
} 

有沒有辦法減少這種使用流?

+0

你爲什麼需要這個? – shmosel

回答

5

是的。您也可以使用Arrays.asList(T...)來創建您的List。然後用Streamcollect這與Boolean.TRUE

List<String> list = Arrays.asList("ab", "bc", "cd"); 
Map<String, Boolean> alphaToBoolMap = list.stream() 
     .collect(Collectors.toMap(Function.identity(), (a) -> Boolean.TRUE)); 
System.out.println(alphaToBoolMap); 

輸出

{cd=true, bc=true, ab=true} 

爲了完整起見,我們也應該考慮一個例子,其中有些價值應該是false。也許就像

List<String> list = Arrays.asList("ab", "bc", "cd", ""); 

Map<String, Boolean> alphaToBoolMap = list.stream().collect(Collectors // 
     .toMap(Function.identity(), (a) -> { 
      return !(a == null || a.isEmpty()); 
     })); 
System.out.println(alphaToBoolMap); 

空鍵,輸出

{=false, cd=true, bc=true, ab=true} 
+0

真棒!首先感謝 –

3

我能想到的最簡單的辦法是不是一個襯墊,但它的確是短:

Map<String, Boolean> map = new HashMap<>(); 
list.forEach(k -> map.put(k, true)); 

這是個人味道,但我只在需要對源進行轉換時使用流,或者過濾掉某些元素等。


正如@ holi-java的評論中所建議的那樣,很多時候,使用MapBoolean的值是沒有意義的,因爲只有兩個可能的值才能映射鍵。相反,可以使用Set來解決幾乎所有與Map<T, Boolean>解決的問題相同的問題。

+0

的投票。我認爲你應該建議OP收集一個'Set'而不是'Map'。那麼問題很簡單,:)。 'Stream.of(...)。collect(toSet())'或'new HashSet(Arrays.asList(...))',因爲'Boolean'在這種情況下只有2個值。 –

+0

@ holi-java嗨!爲什麼要設置? OP希望有一張地圖,其中列表作爲關鍵字,「真」作爲值。 –

+0

,因爲使用具有'Boolean'值的'Map'的用法沒有意義。幾乎所有的'Set '都可以做到。如果他只想打印'foo = true'格式,只需使用'map(it->「$ it = true」)'操作即可。 –

0

如果您要改變現有的Map<..., Boolean>,您可以使用Collections.newSetFromMap。它可以讓你把這樣的地圖當作Set

Collections.newSetFromMap(alphaToBoolMap).addAll(list); 
+0

*指定的映射在調用此方法時必須爲空,並且在此方法返回後不應直接訪問。* – shmosel

相關問題