猿问

在 Java 8 中迭代地图时使用 ForEach 提取多行 Lambda 表达式

我正在使用Java 8迭代如下所示的地图forEach


Map<Integer,String> testMap = new HashMap<>();

testMap.put(1, "Atul");

testMap.put(2, "Sudeep");

testMap.put(3, "Mayur");

testMap.put(4, "Suso");


testMap.entrySet().forEach( (K)-> {         

                System.out.println("Key ="+K.getKey()+" Value = "+K.getValue());

                System.out.println("Some more processing ....");            

            }


    );

我的问题是:


forEach1)我们如何在映射中处理时提取方法?


2)也就是里面的部分代码forEach应该包裹在方法里面:


        System.out.println("Key ="+K.getKey()+" Value = "+K.getValue());

        System.out.println("Some more processing ....");    

3)我理解forEach这种情况下的方法需要一个Consumer具有以下签名的功能接口 -


void accept(T t); 

4)所以我想要的是这样的:


   //declare a consumer object 

   Consumer<Map.Entry<Integer,String>> processMap = null;


  // and pass it to ForEach 

  testMap.entrySet().forEach(processMap);

5)我们能做到吗?


红颜莎娜
浏览 117回答 3
3回答

红糖糍粑

我理解这种情况下的 forEach 方法需要一个具有以下签名的消费者功能接口forEach()确实期望 aConsumer但要处理 aConsumer你不一定需要 a Consumer。您需要的是一种尊重功能接口的输入/输出的方法Consumer,即Entry<Integer,String>输入/void输出。因此,您可以只调用一个方法,该方法的参数为Entry:testMap.entrySet().forEach(k-> useEntry(k)));或者testMap.entrySet().forEach(this::useEntry));使用 useEntry() 例如:private void useEntry(Map.Entry<Integer,String> e)){&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; System.out.println("Key ="+e.getKey()+" Value = "+e.getValue());&nbsp; &nbsp; System.out.println("Some more processing ....");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}Consumer<Map.Entry<Integer,String>>声明您传递给的a ,forEach()例如:Consumer<Map.Entry<Integer,String>> consumer = this::useEntry;//...used then :testMap.entrySet().forEach(consumer);仅当您的消费者forEach()被设计为以某种方式可变(由客户端计算/传递或无论如何)时才有意义。如果您不是这种情况并且您使用了消费者,那么您最终会使事情变得比实际需要的更加抽象和复杂。

慕工程0101907

关于什么public void processMap(Map.Entry K){&nbsp; System.out.println("Key ="+K.getKey()+" Value = "+K.getValue());&nbsp; System.out.println("Some more processing ....");}然后像这样使用它:testMap.entrySet().forEach((K)-> processMap(K));

凤凰求蛊

您可以使用方法参考:Consumer<Map.Entry<Integer,String>> processMap = SomeClass::someMethod;该方法定义为:public class SomeClass {&nbsp; &nbsp; public static void someMethod (Map.Entry<Integer,String> entry) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Key ="+entry.getKey()+" Value = "+entry.getValue());&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Some more processing ....");&nbsp; &nbsp; }}如果您愿意,您甚至可以使该方法更通用:public static <K,V> void someMethod (Map.Entry<K,V> entry) {&nbsp; &nbsp; System.out.println("Key ="+entry.getKey()+" Value = "+entry.getValue());&nbsp; &nbsp; System.out.println("Some more processing ....");}
随时随地看视频慕课网APP

相关分类

Java
我要回答