[英]How to use Java 8 stream to convert a map's key+value into a new value using a function that receives two params?
我有一个静态方法String Converter.convert(String, Integer)
。
我还有一张地图: Map<String, Integer> map
。
我想在map上运行并使用convert方法将每个条目转换为字符串,并继续使用每个转换后的字符串。
我可以这样做:
map.entrySet().stream().map(e -> Converter.convert(e.getKey(), e.getValue()))....;
有没有办法更直观? 像下面这样的东西?
map.stream(Converter::convert)...
???
要么
map.stream((k, v) -> Converter.convert(k, v)))...
???
您可以在某个实用程序类中创建适配器静态方法,如下所示:
public class Functions {
public static <K, V, R> Function<Map.Entry<K, V>, R> entryFunction(
BiFunction<? super K, ? super V, ? extends R> fn) {
return entry -> fn.apply(entry.getKey(), entry.getValue());
}
}
现在您可以像这样使用它:
import static Functions.*;
map.entrySet().stream().map(entryFunction(Converter::convert))...
另一种解决方案是使用一些扩展Java 8 Stream API的第三方库。 其中一个库是我写的免费StreamEx库。 它包含一个特殊的类EntryStream<K, V>
,它实现了Stream<Entry<K, V>>
并提供了其他方便的方法,包括mapKeyValue
,这是你需要的方法:
EntryStream.of(map).mapKeyValue(Converter::convert)...
这和你将获得的一样好。
如果将Map.Entry<String, Integer>
作为参数Map.Entry<String, Integer>
则Converter::convert
方法将起作用。 我建议不要这样做,因为它会对在非映射上下文中使用转换器产生负面影响。
如果您使用Map.forEach
方法,那么您的双参数lambda建议将起作用,但是这不能用于您正在进行的操作。 当你取出你的流时,你有一个Stream<Map.Entry<String, Integer>>
。 虽然在这种情况下,两个arg lambda可能有意义,但编译器无法知道如何将Map.Entry
转换为两个参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.