我浪费了 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>