为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红颜莎娜 2023-03-02 10:40:22
我正在使用Java 8迭代如下所示的地图forEachMap<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)我们能做到吗?
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

我理解这种情况下的 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)){        

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

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

}

Consumer<Map.Entry<Integer,String>>声明您传递给的a ,forEach()例如:


Consumer<Map.Entry<Integer,String>> consumer = this::useEntry;

//...used then :

testMap.entrySet().forEach(consumer);

仅当您的消费者forEach()被设计为以某种方式可变(由客户端计算/传递或无论如何)时才有意义。

如果您不是这种情况并且您使用了消费者,那么您最终会使事情变得比实际需要的更加抽象和复杂。


查看完整回答
反对 回复 2023-03-02
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

关于什么


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));


查看完整回答
反对 回复 2023-03-02
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

您可以使用方法参考:


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 ....");

}


查看完整回答
反对 回复 2023-03-02
  • 3 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信