Java:使用.stream将ArrayList <myobj>转换为TreeMap <string,arraylist <myobj =“”>&gt;

时间:2015-11-05 18:37:37

标签: collections lambda java-8

这是一个Java 8中低级问题:

我在Java 6中有以下代码:

    List <ViewWrapperContentElementTypeProperty> vwPropertyList = getFromDao();


    TreeMap <Long, ArrayList<ViewWrapperContentElementTypeProperty>> mappedProperties = new TreeMap<Long, ArrayList<ViewWrapperContentElementTypeProperty>> ();
    for (ViewWrapperContentElementTypeProperty vwCetP:vwPropertyList)
    {
        if(null==mappedProperties.get(vwCetP.getContentElementTypeId()))
        {

            ArrayList<ViewWrapperContentElementTypeProperty> list = new ArrayList<ViewWrapperContentElementTypeProperty>());
            list.add(vwCetP);
            mappedProperties.put(vwCetP.getContentElementTypeId(), list);
        }
        else
        {
            mappedProperties.get(vwCetP.getContentElementTypeId()).add(vwCetP);
        }

    }

我可以使用vwPropertyList.stream()。map()来更有效地实现它吗?

2 个答案:

答案 0 :(得分:5)

您似乎正在寻找按操作分组。幸运的是,Collectors类提供了一种方法:

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toCollection;    

...

TreeMap<Long, ArrayList<ViewWrapperContentElementTypeProperty>> mappedProperties =
                    vwPropertyList.stream()
                                  .collect(groupingBy(ViewWrapperContentElementTypeProperty::getContentElementTypeId, 
                                                      TreeMap::new,
                                                      toCollection(ArrayList::new)));

我使用了groupingBy的重载版本,您可以在其中提供特定的地图实现(如果您确实需要TreeMap)。

同样,toList()收集器返回ListArrayList,但它是实现细节)。由于您显然需要指定具体实现,因为您希望将ArrayList作为值,您可以使用toCollection(ArrayList::new)来执行此操作。

答案 1 :(得分:4)

关于使用Stream和lambda表达式,当然......这应该如下所示:

Map<Long, List<ViewWrapperContentElementTypeProperty>> mappedProperties =
  vwPropertyList.stream()
      .collect(Collectors.groupingBy(ViewWrapperContentElementTypeProperty::getContentElementTypeId));

请注意,使用上述Stream API方法会强制使用接口(MapList),这无论如何都是一种很好的做法。

在性能方面,它应该与使用传统循环大致相同。