首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecursiveTask结果到ConcurrentMap

RecursiveTask结果到ConcurrentMap
EN

Stack Overflow用户
提问于 2018-04-04 08:51:30
回答 1查看 189关注 0票数 2

我正在尝试创建一个RecursiveTask<Map<Short, Long>>

我用这篇文章作为参考文献

代码语言:javascript
复制
public class SearchTask2 extends RecursiveTask<Map<Short, Long>> {

    private final int majorDataThreshold = 16000;

    private ConcurrentNavigableMap<Short, Long> dataMap;
    private long fromRange;
    private long toRange;
    private boolean fromInclusive;
    private boolean toInclusive;

    public SearchTask2(final Map<Short, Long> dataSource, final long fromRange, final long toRange,
            final boolean fromInclusive, final boolean toInclusive) {
        System.out.println("SearchTask ::  ");
        this.dataMap = new ConcurrentSkipListMap<>(dataSource);
        this.fromRange = fromRange;
        this.toRange = toRange;
        this.fromInclusive = fromInclusive;
        this.toInclusive = toInclusive;
    }

    @Override
    protected Map<Short, Long> compute() {
        System.out.println("SearchTask :: compute ");
        //Map<Short, Long> result = new HashMap<>();
        int size = dataMap.size();
        if (size > majorDataThreshold + 2500) {
             return ForkJoinTask.invokeAll(createSubtasks()).parallelStream().map(ForkJoinTask::join)
             .collect(Collectors.toConcurrentMap(keyMapper, valueMapper));

            //.forEach(entry -> result.put( entry.getKey(), (Long) entry.getValue()));  
        } 
        return  search();
    }

    private List<SearchTask2> createSubtasks() {
        final short lastKey = dataMap.lastKey();
        final short midkey = (short) (lastKey / 2);
        final short firstKey = dataMap.firstKey();
        final List<SearchTask2> dividedTasks = new ArrayList<>();
        dividedTasks.add(new SearchTask2(new HashMap<>(dataMap.subMap(firstKey, true, midkey, false)), fromRange,
                toRange, fromInclusive, toInclusive));
        dividedTasks.add(new SearchTask2(new HashMap<>(dataMap.subMap(midkey, true, lastKey, true)), fromRange, toRange,
                fromInclusive, toInclusive));
        return dividedTasks;
    }

    private HashMap<Short,Long> search(){
        //My Search logic for values
        return new HashMap<>();
    }
}

有人能帮我keyMapper和'valueMapper‘作为我的结果地图,我尝试了Collectors.toConcurrentMap(entry -> entry.getKey(), entry -> entry.getValue())

但它让我看到了一个错误

代码语言:javascript
复制
Cannot infer type argument(s) for <R, A> collect(Collector<? super T,A,R>)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-04 08:59:52

您的ForkJoinTask::join正在返回一个映射,因此您有一个映射流。你似乎在期待一串条目。您可以使用flatMap从映射流获取条目流,如下所示:

代码语言:javascript
复制
return ForkJoinTask.invokeAll(createSubtasks())
    .parallelStream()
    .map(ForkJoinTask::join)
    .flatMap(map -> map.entrySet().stream())   // you were missing this line
    .collect(
        Collectors.toConcurrentMap(entry -> entry.getKey(), entry -> entry.getValue())
    );

作为一个小小的改进,您还可以使用方法引用,而不是尝试的lambda表达式:

代码语言:javascript
复制
Collectors.toConcurrentMap(Entry::getKey, Entry::getValue)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49646672

复制
相关文章

相似问题

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