首页 > 解决方案 > 地图流 - 误导 Intellij 错误/警告 - 这是一个错误吗?

问题描述

我浪费了 30 分钟,过度依赖 IDE 错误警报,而不是编译器警报。

下面的类有一个错误,但是,IDE 显示了一个不相关的错误,这让我从实际错误中分心。

这是intellij中的错误吗?

import java.util.*;

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summingLong;

class VisitCounter {

    public static void main(String [] args){

        VisitCounter v = new VisitCounter();
        Map<String, UserStats> ms1 = new HashMap<String, UserStats>() {{
            put("100001", new UserStats(10L));
            put("100002", new UserStats(1L));
        }};
        Map<String, UserStats> ms2 = new HashMap<String, UserStats>() {{
            put("100001", new UserStats(10L));
            put("100002", new UserStats(1L));
            put("100003", null);//this should not cause error
            put("ABCDEF", new UserStats(1L));//this should not cause error
        }};
        Map<String, UserStats> ms3 = new HashMap<String, UserStats>() {{
            put("100001", new UserStats(10L));
            put("100002", new UserStats(1L));
        }};
        Map<String, UserStats> msNull = null;

        Map<Long, Long> result = v.count(ms1, ms2, ms3,msNull);
        System.out.println(result);

    }


    public Map<Long, Long> count(Map<String, UserStats>... visits) {
        if (Objects.isNull(visits)) return Collections.emptyMap();

        Map<String, Long> result = Arrays.stream(visits)
                .filter(Objects::nonNull)//take out null maps
                .flatMap(m -> m.entrySet().parallelStream()) // just unpack to entry set . Hey use multi-core!
                .filter( entry -> isValidUserId(entry.getKey())) // is key valid , not null, Long parsable
                .filter( entry -> isValiduserStats(entry.getValue())) // is key valid , not null, Long parsable
                .map( entry -> new AbstractMap.SimpleEntry<Long, Long>(Long.parseLong(entry.getKey()), entry.getValue().getVisitCount().get())) // convert to Long, Long
                .collect(groupingBy(Map.Entry::getKey, summingLong(Map.Entry::getValue)));
        return result;
    }

    boolean isValidUserId(String key){
        if (Objects.isNull(key)) return false; // null filter
        try{
            Long.parseLong(key);
        }catch( Exception e){
            return false; // not long, filter
        }
        return true;
    }
    boolean isValiduserStats(UserStats stat){
        if (Objects.isNull(stat)) return false;  //null filter
        if (!stat.getVisitCount().isPresent()) return false; // null value filter
        return true;
    }
}

IDE 显示了这个虚假错误,这让我偏离了轨道。浪费了 15-20 分钟后,我点击 compile ,并且能够看到编译器

在此处输入图像描述

编译器的实际错误非常清楚。但我更多地依赖编译器:-(

/test/src/VisitCounter.java:45:16
java: incompatible types: java.util.Map<java.lang.String,java.lang.Long> cannot be converted to java.util.Map<java.lang.Long,java.lang.Long>

标签: intellij-idea

解决方案


推荐阅读