V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mawerss1
V2EX  ›  Java

请教大家 java8 stream 的问题

  •  
  •   mawerss1 · 2019-01-25 13:32:03 +08:00 · 3016 次点击
    这是一个创建于 2165 天前的主题,其中的信息可能已经有所发展或是发生改变。

    下面的代码怎么用 stream 实现呢?想了半天绕不明白,stram api 用的太少了

    public void countBlame(List<Blame> blames) {
        final HashMap<String, TotalResult> map = map();
        for (Blame author : blames) {
            if (map.containsKey(author.getName())) {
                final TotalResult totalResult = map.get(author.getName());
                totalResult.setRows(totalResult.getRows() + author.getRows());
            }else{
                final TotalResult totalResult = new TotalResult(author.getName(), 0, 0, author.getRows(), null);
                map.put(author.getName(), totalResult);
                results.add(totalResult);
            }
        }
    }
    
    private HashMap<String,TotalResult> map() {
        final HashMap<String, TotalResult> stringTotalResultHashMap = new HashMap<>();
        for (TotalResult result : results) {
            stringTotalResultHashMap.put(result.getName(), result);
        }
        return stringTotalResultHashMap;
    }
    
    8 条回复    2019-01-29 09:56:18 +08:00
    GTim
        1
    GTim  
       2019-01-25 13:57:19 +08:00
    第二个

    results.stream().collect(Collectors.toMap(TotalResult::getName, result -> result))
    EXE
        2
    EXE  
       2019-01-25 13:57:33 +08:00
    results.stream().collect(Collectors.toMap(TotalResult::getName));
    Volio
        3
    Volio  
       2019-01-25 14:13:11 +08:00
    List<TotalResult> result = blames.stream().collect(Collectors.groupingBy(Blame::getName, Collectors.mapping(Blame::getRows, Collectors.reducing(0, Integer::sum)))).entrySet().stream().map(o -> new TotalResult(o.getKey(),0,0,o.getValue(),null)).collect(Collectors.toList());
    GTim
        5
    GTim  
       2019-01-25 14:20:59 +08:00
    第一个

    blames.stream().map(author => new TotalResult(author.getName(), 0, 0, author.getRows(), null)).collect(Collectors.toMap(TotalResult::getName, result -> result,(oldValue,newValue)-> {oldValue.setRows(oldValue.getRows() + newValue.getRows();return oldValue;}))
    mawerss1
        6
    mawerss1  
    OP
       2019-01-25 14:24:57 +08:00
    @yidinghe 醍醐灌顶,感谢老哥
    daemonk
        7
    daemonk  
       2019-01-25 14:28:33 +08:00
    Map<String, TotalResult> map = blames.stream().collect(
    Collectors.toMap(
    Blame::getName,
    blame -> new TotalResult(blame.getName(), 0, 0, blame.getRows(), null),
    (tr1, tr2) -> {
    tr1.setRows(tr1.getRows() + tr2.getRows());
    return tr1;
    }, HashMap::new));
    List<TotalResult> results = new ArrayList<>(map.values());
    thinkmore
        8
    thinkmore  
       2019-01-29 09:56:18 +08:00
    为啥我看着 lambda 这么费力
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1246 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:37 · PVG 01:37 · LAX 09:37 · JFK 12:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.