首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java函数编程:创建函数映射

Java函数编程:创建函数映射
EN

Stack Overflow用户
提问于 2015-12-22 06:21:44
回答 4查看 1.4K关注 0票数 1

我有一个上下文映射,它存储按默认顺序排序的列表。

代码语言:javascript
复制
Map<String,Object> context = new HashMap<String,Object>();
context.put("list_all_content_default",getAllContentSortedDefault());

其中,getAllContentSortedDefault()返回按默认顺序排序的列表。

现在,我想以两种不同的顺序存储相同的列表,比如创建日期。

我的客户端无法检索列表,然后对其进行排序.

因此,我可以选择使用不同的键两次填充相同的上下文映射。

代码语言:javascript
复制
context.put("list_all_content_createdate",getAllContentSortedCreateDate());

但这意味着,用不同的键两次在上下文中存储相同的元素。

在Java 8中是否可以将方法的引用存储在Map中,这些方法可以在调用时调用。例如,类似于

代码语言:javascript
复制
    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(); 
});

这将帮助我节省内存,并创建所需的排序行为。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-22 06:42:04

是的那当然是可能的。听起来好像您只需要一个传递给您的函数的Comparator,然后您就可以对其进行排序了。如果可能的话,我建议返回一个Stream而不是一个List --那么您可以自己对它进行排序。

我假设您的地图需要存储多个列表,调用者传递一个键来指定他们想要的列表。如果你只有一个列表,那么你显然不需要地图。

代码语言:javascript
复制
Map<String,List<Content>> contents = new HashMap<>();
contents.put("first", getMyContents());

public Stream<Content> getMySortedContent(Comparator comparator) {
    return contents.get("first").sorted(comparator);
}

如果您真的只有一个列表,并且希望将比较器存储在您的地图中:

代码语言:javascript
复制
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));
}

最后,如果您真的想拥有一个检索排序列表的方法的映射,那么当然也可以这样做:

代码语言:javascript
复制
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;
}

我不太喜欢最后的方法。

如果有什么让你困惑的话,请告诉我,我会进一步解释的。

票数 2
EN

Stack Overflow用户

发布于 2015-12-22 06:50:52

是的有可能。您需要创建一个映射,然后通过传递比较器来缩短任何属性。

代码语言:javascript
复制
Stream<Map.Entry<K,V>> sorted = map.entrySet().stream()
                                   .sorted(Map.Entry.comparingByValue(comparator));
票数 4
EN

Stack Overflow用户

发布于 2015-12-22 07:01:23

Java8将每个可能的函数定义为java.util.function包中的接口。因此,从本质上说,您需要做的就是有一个这些函数接口的映射。

代码语言:javascript
复制
Map<String, List<BiFunction>> myFunctionMap;

List<BiFunction> list;
list.add(new MyClassImplementingFunctionalInterface());

myFunctionMap.put('ABC', list);

来存储所有这些变量。如果您希望同一个函数同时具有可比性,您可以自由地从Comparable和您的函数接口创建一个超级接口。

但是,只有在映射中有1种类型的函数时,这才适用。如果可能有多种类型的函数,我认为您需要编写自己的接口并定义方法。

注意:当你做这样的事情时

代码语言:javascript
复制
Collection<Integer> c = new ArrayList<Integer>();
c.forEach((i) -> { System.out.println(i); } );

本质上,您定义了一个扩展java.util.function.Consumer<Integer>接口的阳极对象。这就是为什么你可以把这样的物体放到地图上。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34409646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档