2015-09-23 73 views
1

我有一個像下面兩個集合:轉換收集到地圖

Set<String> attributes = Sets.newHashSet("aaa", "bbb", "ccc", "ddd"); 
Set<String> activeAttributes = Sets.newHashSet("eee", "lll", "ccc", "mmm"); 

到這些集合轉換成地圖的想法,因爲attributes收集應作爲這個地圖的鑰匙和activeAttributes應該計算時使用值(如果activeAttributes包含從收集attributes然後「真」,否則爲「假」參數應設置值):

作爲例子:

({aaa -> false, bbb -> false, ccc -> true, ddd -> false }) 

我試圖創建一個轉換列表中的Map.Entry的集合番石榴功能:

private static class ActiveAttributesFunction implements Function<String, Map.Entry<String, Boolean>> { 

    private Set<String> activeAttributes; 

    public ActiveAttributesFunction (Set<String> activeAttributes) { 
     this.activeAttributes = activeAttributes; 
    } 

    @Override 
    public Map.Entry<String, Boolean> apply(String input) { 
     return Maps.immutableEntry(input, activeAttributes.contains(input)); 
    } 
} 

但是,這個功能將需要轉換的條目映射的列表中。

請建議這可以簡化爲什麼?

+0

你不想使用標準的「for」循環? – Pras

回答

4

如果您使用的是Java 8中,您可以執行以下操作:

Set<String> attributes = Sets.newHashSet("aaa", "bbb", "ccc", "ddd"); 
Set<String> activeAttributes = Sets.newHashSet("eee", "lll", "ccc", "mmm"); 
Map<String, Boolean> map = attributes.stream().collect(Collectors.toMap(s -> s, activeAttributes::contains)); 
System.out.println(map); 

對於Java,並與番石榴的早期版本,您可以使用Maps.asMap因爲番石榴14.0:

Map<String, Boolean> map = Maps.asMap(
    attributes, Functions.forPredicate(Predicates.in(activeAttributes))); 

注這將返回一個實時副本(對該集合的任何更改都會反映在地圖上)。如果你想要一個不可變的地圖,請使用Maps.toMap

+0

Tunaki:感謝您的回答,但不幸的是我們正在使用java 7.會更新標籤。 – fashuser

+0

@fashuser答覆用番石榴解決方案更新。 – Tunaki

+0

非常感謝! – fashuser