2015-09-23 3 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 }) 

Я пытался создать функцию, которая преобразует Guava список коллекции 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

Вы не хотите использовать стандартный цикл «для»? – 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 Отвечено обновлено с помощью решения Guava. – Tunaki

+0

Спасибо вам большое! – fashuser

Смежные вопросы