如何使用java8

时间:2018-09-08 13:41:33

标签: java lambda java-8 hashmap method-reference

我正在尝试使用java中的two输出基本的hashmap

Map<Integer, String> mp = new HashMap<Integer, String>();
mp.put(10, "apple");
mp.put(20, "orange");
mp.put(30, "banana");

但是在java8中的method reference方面,我不知道如何打印多个参数。

我尝试过这样的事情。但这给了我编译错误。

mp.forEach(System.out::println(i+" "+s););

请帮助我解决这个问题。 谢谢。

6 个答案:

答案 0 :(得分:8)

可能与其他答案相矛盾,但是我真的不需要您在此处使用方法引用。恕我直言,

-l:pdcurses.a
对于这种用例,

比方法参考要好得多。

答案 1 :(得分:5)

您可以编写一个单独的方法,例如:

public static <K, V> void printEntry(Map.Entry<K, V> e) {
    System.out.println(e.getKey() + " " + e.getValue());
}

map.entrySet().forEach(Demo::printEntry);

或者,如果Map.Entry<K, V>.toString()符合您的要求:

map.entrySet().forEach(System.out::println);

// 20=orange
// 10=apple
// 30=banana

编辑:另外,按照@Holger的建议,只要方法中的代码不依赖于类型参数,就可以安全地省略类型参数:

public static void printEntry(Object k, Object v) {
    System.out.println(k + " " + v);
}

map.forEach(Demo::printEntry);

答案 2 :(得分:5)

不能。该语言不允许这样做,那里没有隐式的i和s可以通过这种方式传递给方法引用。您可以做什么,不知道为什么,但是您可以:

private static <K, V> void consumeBoth(K k, V v) {
     //Log how u want this
}

并用于:

map.forEach(Yourclass::consumeBoth)

但这可以使用lambda表达式完成,对于这个小例子,我真的看不到任何好处

答案 3 :(得分:4)

您不能使用方法参考System.out::println来指定空格。
传递给System.out::println的参数由BiConsumer的{​​{1}}参数推断。

但是您可以使用Map.forEach(BiConsumer)格式化预期的String,这样,map()中推断出的参数将是格式化的字符串,您需要:

System.out::println

答案 4 :(得分:1)

您也可以使用entrySet进行打印

 mp.entrySet().forEach(e->System.out.println(e.getKey()+"="+e.getValue()));

答案 5 :(得分:1)

我终于找到了一个解决方案,但是在Java 8中使用了Apache API Pair类(ImmutablePair)。

Stream.of(ImmutablePair.of("A", "1"), ImmutablePair.of("B", "0")) .collect(Collectors.toMap(Pair::getLeft, Pair::getRight));

希望有帮助。