如何使用 forEach 或 forEachValue 方法

我有一个ConcurrentHashMap<String, Document>,我必须调用一个方法来删除每个值的文件。

Document 是将文档表示为文件的类。

我在 eclipse 上发现了 forEach 和 forEachValue 方法(具有许多签名),但我不知道如何使用它们(有人可以向我解释一下吗?)。

我可以调用 ConcurrentHashMap 方法:

  • elements 方法获得Enumeration<V>

  • Values 方法获取 aCollection<V>并因此获取迭代器

哪些解决方案更好?


慕容森
浏览 218回答 3
3回答

MYYA

您可以使用 ,example 轻松迭代map键或值for each loop:Map<String,Document> chm=new ConcurrentHashMap<String,document>();//this for each loop will iterate over the values of the map//to iterate over the keys you write: for(String str : chm.keySet())for(Document doc : chm.values()){&nbsp; &nbsp;// code to delete the document&nbsp;&nbsp; &nbsp;// example(if your Document exposes a delete method): doc.delete();}正如您在 a 中看到的,for each loop您首先声明对象的类型:String、int等Document...第二部分是您的局部变量,例如在上面的情况下,文档将是Document您的每个变量map,您可以调用与它相关的任何方法。第三部分是the :,你可以把它想象成“in”这个词最后一部分是您想要迭代的内容,在上面的情况下它是 的map值Enumeration 和 Iterator 接口的主要区别在于 Enumeration 只遍历 Collection 对象,在使用 Enumeration 进行迭代时不能对集合进行任何修改。其中 Iterator 接口允许您在遍历 Collection 对象时删除元素(使用该remove()方法)。

慕容708150

该forEach方法以 aBiConsumer作为参数,其中消费者的输入是映射中的键和值对:void forEach(long parallelismThreshold, BiConsumer<? super K,? super V> action)该forEachValue方法以 aConsumer作为参数,其中消费者的输入只是映射中的值:void forEachValue(long parallelismThreshold, Consumer<? super V> action)在每种方法中,您可以定义文档parallelismThreshold中的说明:这些批量操作接受parallelismThreshold 参数。如果估计当前地图大小小于给定阈值,方法将按顺序进行。使用 Long.MAX_VALUE 值会抑制所有并行性。因此forEach,如果您需要键和值,请使用forEachValue,如果您只需要值,请使用:例如myMap.forEach(Long.MAX_VALUE, (key, document) -> deleteDocument(key, document)); ... public void deleteDocument(String key, Document d) { ... }或者:myMap.forEachValue(Long.MAX_VALUE, document -> deleteDocument(document)); ... public void deleteDocument(Document d) { ... }

开心每一天1111

如果您需要对 中的每个值执行某些操作ConcurrentHashMap,您有很多选择:for (Map.Entry<String, Document> entry : map.entrySet()) {    String key = entry.getKey();    Document doc = entry.getValue();    // code here}for (String key : map.keySet()) {    // code here}for (Document doc : map.values()) {    // code here}map.forEach((key, doc) -> {    // code here});map.forEach(1, (key, doc) -> {    // code here will run in parallel});map.forEachEntry(1, entry -> {    String key = entry.getKey();    Document doc = entry.getValue();    // code here will run in parallel});map.forEachKey(1, key -> {    // code here will run in parallel});map.forEachValue(1, doc -> {    // code here will run in parallel});上面的示例使用了 lambda 表达式块,但是如果code here只是一条语句,您可以省略{}大括号和;语句终止符,并将所有内容保留在一行中,使其看起来更清晰,例如map.forEachValue(Long.MAX_VALUE, doc -> DocUtil.deleteFile(doc));或者使用方法参考:map.forEachValue(Long.MAX_VALUE, DocUtil::deleteFile);您更喜欢上述哪一个完全取决于您,部分取决于您是否需要key、doc或两者,以及是否需要并行处理。删除文件时并行处理可能不会提高性能,因为这可能需要磁盘访问,但如果性能至关重要,您可以尝试并行运行并亲自看看这是否有帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java