我正在使用 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)我们可以实现吗?
答案 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 ....");
}