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

时间:2019-07-02 11:32:33

标签: java foreach java-8

我正在使用 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 ....");            
            }

    );

我的问题是:

1)在地图中进行处理时,如何从forEach中提取方法?

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)我们可以实现吗?

3 个答案:

答案 0 :(得分:3)

  

我了解在这种情况下,forEach方法期望使用方   具有以下签名的功能接口

forEach()确实期望Consumer,但是要处理Consumer,则不一定需要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)){        
    System.out.println("Key ="+e.getKey()+" Value = "+e.getValue());
    System.out.println("Some more processing ....");                        
}

声明要传递给Consumer<Map.Entry<Integer,String>>的{​​{1}},例如:

forEach()

只有在您的Consumer<Map.Entry<Integer,String>> consumer = this::useEntry; //...used then : testMap.entrySet().forEach(consumer); 中的消费者被设计为以某种方式可变性(由客户计算/传递或通过客户端传递)时,它才有意义。
如果您不是在这种情况下,而是使用了使用者,那么最终会使事情变得比实际需要的更为抽象和复杂。

答案 1 :(得分:1)

public void processMap(Map.Entry K){
  System.out.println("Key ="+K.getKey()+" Value = "+K.getValue());
  System.out.println("Some more processing ....");
}

然后像这样使用它:

testMap.entrySet().forEach((K)-> processMap(K));

答案 2 :(得分:0)

您可以使用方法参考:

Consumer<Map.Entry<Integer,String>> processMap = SomeClass::someMethod;

该方法定义为:

public class SomeClass {

    public static void someMethod (Map.Entry<Integer,String> entry) {
        System.out.println("Key ="+entry.getKey()+" Value = "+entry.getValue());
        System.out.println("Some more processing ....");
    }

}

如果愿意,您甚至可以使该方法更通用:

public static <K,V> void someMethod (Map.Entry<K,V> entry) {
    System.out.println("Key ="+entry.getKey()+" Value = "+entry.getValue());
    System.out.println("Some more processing ....");
}