这是一个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()来更有效地实现它吗?
答案 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()
收集器返回List
(ArrayList
,但它是实现细节)。由于您显然需要指定具体实现,因为您希望将ArrayList
作为值,您可以使用toCollection(ArrayList::new)
来执行此操作。
答案 1 :(得分:4)
关于使用Stream
和lambda表达式,当然......这应该如下所示:
Map<Long, List<ViewWrapperContentElementTypeProperty>> mappedProperties =
vwPropertyList.stream()
.collect(Collectors.groupingBy(ViewWrapperContentElementTypeProperty::getContentElementTypeId));
请注意,使用上述Stream API方法会强制使用接口(Map
,List
),这无论如何都是一种很好的做法。
在性能方面,它应该与使用传统循环大致相同。