Java 使用流从列表中获取前3个计数

Java 使用流从列表中获取前3个计数,java,java-8,java-stream,Java,Java 8,Java Stream,我正在尝试将java7程序转换为Java8。我希望下面的输出使用流API public List<String> getTopThreeWeatherCondition7() { List<String> _Top3WeatherList = new ArrayList<String>(); Map<String, Integer> _WeatherCondMap = getWeatherCondition7(); List

我正在尝试将java7程序转换为Java8。我希望下面的输出使用流API

public List<String> getTopThreeWeatherCondition7() {
    List<String> _Top3WeatherList = new ArrayList<String>();
    Map<String, Integer> _WeatherCondMap = getWeatherCondition7();
    List<Integer> _WeatherCondList = new ArrayList<Integer>(_WeatherCondMap.values());
    Collections.sort(_WeatherCondList, Collections.reverseOrder());
    List<Integer> _TopThreeWeathersList = _WeatherCondList.subList(0, 3);
    Set<String> _WeatherCondSet = _WeatherCondMap.keySet();
    Integer count = 0;
    for (String _WeatherCond : _WeatherCondSet) {
        count = _WeatherCondMap.get(_WeatherCond);
        for (Integer _TopThreeWeather : _TopThreeWeathersList) {
            if (_TopThreeWeather == count) {
                _Top3WeatherList.add(_WeatherCond);
            }
        }
    }
    _WeatherCondList = null;
    _WeatherCondMap = null;
    _TopThreeWeathersList = null;
    _WeatherCondSet = null;
    return _Top3WeatherList;

}
public List getTopThreeWeatherCondition7(){
列表_Top3WeatherList=newarraylist();
Map _WeatherCondMap=getWeatherCondition7();
List _WeatherCondList=newarraylist(_WeatherCondMap.values());
Collections.sort(_WeatherCondList,Collections.reverseOrder());
列表TopThreeWeathersList=WeatherCondList.subList(0,3);
Set _WeatherCondSet=_WeatherCondMap.keySet();
整数计数=0;
用于(字符串_WeatherCond:_WeatherCondSet){
count=\u WeatherCondMap.get(\u WeatherCond);
对于(整数_TopThreeWeather:_TopThreeWeathersList){
如果(_TopThreeWeather==计数){
_Top3天气列表。添加(_WeatherCond);
}
}
}
_WeatherCondList=null;
_WeatherCondMap=null;
_TopThreeWeathersList=null;
_WeatherCondSet=null;
返回_Top3天气列表;
}

我强烈建议遵守Java编码惯例。变量名称以小写字母开头,而不是
.
+大写字母。其次,使用后不要将局部变量赋值给
null
。这已经过时了,并且偏离了代码的实际用途。另外,不要使用未使用的默认值初始化变量(如
count=0
)。在这种特定情况下,还应该在实际使用变量的内部循环中声明该变量

还要注意,您正在比较的是
Integer
引用,而不是值。在这种特定情况下,它可能会工作,因为对象来自同一个贴图,但您应该避免这种情况。目前尚不清楚是否存在重复值;在这种情况下,此循环将不会执行正确的操作。此外,您不应该仅为了对每个键执行
get
查找而迭代
keySet()
,因为有
entrySet()
允许同时迭代键和值

既然您说过,这段代码应该是一个“Java7程序”,那么您应该注意“菱形运算符”(
)的存在,它消除了在创建泛型类的新实例时重复类型参数的需要

您应该首先对条目进行排序,而不是仅对值进行排序并搜索关联的键

因此,原始代码的干净Java 7变体是:

static final Comparator<Map.Entry<String, Integer>> BY_VALUE_REVERSED=
    new Comparator<Map.Entry<String, Integer>>() {
        public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
            return Integer.compare(o2.getValue(), o1.getValue());
        }
    };
public List<String> getTopThreeWeatherCondition7() {
    List<String> top3WeatherList = new ArrayList<>();
    Map<String, Integer> weatherCondMap = getWeatherCondition7();
    List<Map.Entry<String, Integer>> entryList=new ArrayList<>(weatherCondMap.entrySet());
    Collections.sort(entryList, BY_VALUE_REVERSED);
    List<Map.Entry<String, Integer>> topThreeEntries = entryList.subList(0, 3);
    for(Map.Entry<String, Integer> entry: topThreeEntries) {
        top3WeatherList.add(entry.getKey());
    }
    return top3WeatherList;
}

由于标记,请设置更多标记以与更多用户对话。例如,add:java,java7,java8。根据您试图做的事情,我会从头开始:getWeatherCondition7().valueSet().stream().sorted(Collections.reverseOrder()).limit(3.collection(Collections.toList());这应该会让你朝着正确的方向开始,我不会称之为“Java7程序”。首先,使用标准命名约定,即变量名称以小写字母开头,而不是以大写字母开头。第二,使用后不要将变量赋值给
null
。第三,不要用未使用的默认值初始化变量(如
count=0
)。解决这些问题后,我们可以称之为“Java程序”。开始使用“菱形运算符”
,而不是重复类型参数,我们可以称之为“Java 7程序”。您知道该流是否与获得3个最佳条件的速度一样快吗?因为排序是O(logn),而for的3是O(n)。。。或者限制“改变”了排序算法?@ThiagoSuchorski原则上,如果流实现使用了关于此类后续操作的知识(启用此类优化是API的目的),则是合法的,但对于参考实现(所有基于OpenJDK的环境),此类优化尚未发生。如果对于您的任务来说,性能比简单性更重要,那么中的某些东西会更好。谢谢,我已经实现了我的方法。
public List<String> getTopThreeWeatherCondition7() {
    Map<String, Integer> weatherCondMap = getWeatherCondition7();
    List<String> top3WeatherList = 
        weatherCondMap.entrySet().stream()
            .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
            .limit(3)
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());
    return top3WeatherList;
}