使用forEach循环之外的变量

时间:2017-02-11 14:59:55

标签: java java-8 java-stream

我是java的新手,我正在修补forEach循环。

我想在循环之外使用entry.getValue(),如下所示:

hashmap.entrySet().stream()
    .sorted(Map.Entry<String,Double>comparingByValue())
    .limit(1).forEach(entry->
        {System.out.print("Worst output: " + entry.getValue() + ");}
    );
....//print the one iteration of previous loop, or use entry.getValue() as var

3 个答案:

答案 0 :(得分:3)

我相信您希望mapdouble条目改为double worst = hashmap.entrySet().stream() .mapToDouble(Map.Entry<String,Double>::getValue).min().getAsDouble(); System.out.println("Worst output: " + worst); ,然后使用DoubleStream.min()类似的内容,

min()

如果您确实希望最大值使用max()而不是// test_main.cpp #include <thread> #include <iostream> #include <string> std::mutex gMutex; void PrintLoop(const std::string& str, const uint32_t& time) { for (uint32_t i=0; i<time; i++) { gMutex.lock(); std::cout << str << ": " << i << std::endl; gMutex.unlock(); } } int main(int argc, char* argv[]) { std::thread t0(&PrintLoop, "Thread0", 100); std::thread t1(&PrintLoop, "Thread1", 100); t0.join(); t1.join(); return 0; }

答案 1 :(得分:2)

您只需使用max方法即可获得最高价值:

Double max = hashmap.values()
                    .stream()
                    .max(Comparator.naturalOrder())
                    .orElse(null);

答案 2 :(得分:2)

如果您想对整个Map.Entry执行某些操作,并且还要优雅地处理空地图,我建议您使用Optional执行此操作。

Optional<Map.Entry<String, Double>> o = hashmap.entrySet().stream().min(Map.Entry.comparingByValue());
o.ifPresent(entry -> System.out.println(entry.getKey() + " " + entry.getValue()));

这样,如果地图中至少有一个条目,则返回最低的条目,并且由于它包含在可选项中,因此您也可以轻松处理空案例。在上面的示例代码中,它将打印密钥和值(如果存在),或者如果不存在则不执行任何操作。