2016-09-20 118 views
1

如何获得连击“值列表”在地图中创建一个列表,然后传递到另一个方法:如何将“列表类型的Hashmap值”转换为Set?

Map<Long,List<Long>> activities = new HashMap(); 
for(Something s: something){ 
    activities .put(prosessLongID, listOfSubProcesses); 
} //There are 5 something and for each there are 2 List of Subprocesses which makes 10 Subprocesses 

我想从上面的地图拼接子进程的列表来创建一个集:

ImmutableSet.copyOf(listOfSubProcesses_ForAllSomething) //com.google.common.collect 

Map中有没有任何方法返回单个列表中的所有SubProcesses列表,我可以通过上面的方法?

注意:我在Java 8上得到了@Eran的回应,并且非常感谢。但请考虑Java 6和其他循环的解决方案。我有APache Commons和Guava的设施。 :)

+1

有一个方法'集合值()',所有你需要做的是检查的文件.. 。 – Lucas

回答

1

您可以使用Java 8流API来收集所有的List s转换为单Stream,然后到一个单一的List

List<Long> listOfSubProcesses_ForAllSomething = 
    activities.values().stream().flatMap(List::stream).collect(Collectors.toList()); 
+0

Thanks.But我现在没有使用Java-8。 Upvote for Java for Java 8.那么Java 6 – fatherazrael

+2

@fatherazrael然后使用循环和addAll将每个列表的元素添加到单个列表中。 – Eran

+0

我明白了。 Guava或Apache Common中没有任何快捷方式或库方法? – fatherazrael

4

如果你不能使用Java 8个流,利用番石榴的FluentIterable (和Map#values()如@Lukas在评论中提及):

ImmutableSet<Long> subprocessIds = FluentIterable.from(activities.values()) 
     .transformAndConcat(Functions.identity()) 
     .toSet(); 

FluentIterable#transformAndConcat相当于Stream#flatMap,恒等函数确实有效诺斯ING,所以它是直接翻译自@叶兰的Java 8回答番石榴和Java 7

或者您可以使用Iterables#concat达到不流利的电话相同的结果:

ImmutableSet<Long> subprocessIds = ImmutableSet.copyOf(
     Iterables.concat(activities.values())); 

什么你真正想要做的是使用正确的数据结构,在这里:(?或者甚至SetMultimapListMultimap

ListMultimap<Long, Long> activities = ArrayListMultimap.create(); 
activities.putAll(1L, ImmutableList.of(2L, 32L, 128L)); 
activities.put(3L, 4L); 
activities.put(3L, 8L); 

因为Multimap#values()给你你需要什么(如Collection视图,因此如果neccessary复制到Set):

ImmutableSet<Long> subprocessIds = ImmutableSet.copyOf(activities.values()); 
+0

谢谢。我会尝试这些并将其标记为答案。 :) – fatherazrael

相关问题