我有一个上下文映射,它存储按默认顺序排序的列表。
Map<String,Object> context = new HashMap<String,Object>();
context.put("list_all_content_default",getAllContentSortedDefault());其中,getAllContentSortedDefault()返回按默认顺序排序的列表。
现在,我想以两种不同的顺序存储相同的列表,比如创建日期。
我的客户端无法检索列表,然后对其进行排序.
因此,我可以选择使用不同的键两次填充相同的上下文映射。
context.put("list_all_content_createdate",getAllContentSortedCreateDate());但这意味着,用不同的键两次在上下文中存储相同的元素。
在Java 8中是否可以将方法的引用存储在Map中,这些方法可以在调用时调用。例如,类似于
context.put("list_all_content_createdate",{
List<Contents> all_contents = (List<Contents>)context.get("list_all_content_default");
return Collections.sort(all_contents, new ContentComparatorByCreateDate();
});这将帮助我节省内存,并创建所需的排序行为。
发布于 2015-12-22 06:42:04
是的那当然是可能的。听起来好像您只需要一个传递给您的函数的Comparator,然后您就可以对其进行排序了。如果可能的话,我建议返回一个Stream而不是一个List --那么您可以自己对它进行排序。
我假设您的地图需要存储多个列表,调用者传递一个键来指定他们想要的列表。如果你只有一个列表,那么你显然不需要地图。
Map<String,List<Content>> contents = new HashMap<>();
contents.put("first", getMyContents());
public Stream<Content> getMySortedContent(Comparator comparator) {
return contents.get("first").sorted(comparator);
}如果您真的只有一个列表,并且希望将比较器存储在您的地图中:
Map<String,Comparator<Content>> comparatorMap = new HashMap<>();
comparatorMap.put("byCreateDate", Comparator.comparingBy(Content::getData));
comparatorMap.put("byName", Comparator.comparingBy(Content::getName));
public Stream<Content> getSortedContent(String comparatorKey) {
return getContentList().stream()
.sorted(comparatorMap.get(comparatorKey));
}最后,如果您真的想拥有一个检索排序列表的方法的映射,那么当然也可以这样做:
Map<String,Supplier<List<Content>>> supplierMap = new HashMap<>();
supplierMap.put("unsorted", this::unsortedList);
supplierMap.put("sorted_by_date" this::sortedByDate);
public List<Content> getContents(String supplierKey) {
return supplierMap.get(supplierKey).get();
}
private List<Content> unsortedList() {
return contentsList;
}
private List<Content> sortedByDate() {
Collections.sort(contentsList, Comparator.comparingBy(Content::getDate));
return contentsList;
}我不太喜欢最后的方法。
如果有什么让你困惑的话,请告诉我,我会进一步解释的。
发布于 2015-12-22 06:50:52
是的有可能。您需要创建一个映射,然后通过传递比较器来缩短任何属性。
Stream<Map.Entry<K,V>> sorted = map.entrySet().stream()
.sorted(Map.Entry.comparingByValue(comparator));发布于 2015-12-22 07:01:23
Java8将每个可能的函数定义为java.util.function包中的接口。因此,从本质上说,您需要做的就是有一个这些函数接口的映射。
Map<String, List<BiFunction>> myFunctionMap;
List<BiFunction> list;
list.add(new MyClassImplementingFunctionalInterface());
myFunctionMap.put('ABC', list);来存储所有这些变量。如果您希望同一个函数同时具有可比性,您可以自由地从Comparable和您的函数接口创建一个超级接口。
但是,只有在映射中有1种类型的函数时,这才适用。如果可能有多种类型的函数,我认为您需要编写自己的接口并定义方法。
注意:当你做这样的事情时
Collection<Integer> c = new ArrayList<Integer>();
c.forEach((i) -> { System.out.println(i); } );本质上,您定义了一个扩展java.util.function.Consumer<Integer>接口的阳极对象。这就是为什么你可以把这样的物体放到地图上。
https://stackoverflow.com/questions/34409646
复制相似问题