Ali*_*aka 6 java java-8 java-stream
我有一个静态方法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());
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以像这样使用它:
import static Functions.*;
map.entrySet().stream().map(entryFunction(Converter::convert))...
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是使用一些扩展Java 8 Stream API的第三方库.其中一个库是我写的免费StreamEx库.它包含一个特殊的类EntryStream<K, V>,它实现Stream<Entry<K, V>>并提供了其他方便的方法,包括mapKeyValue你需要的方法:
EntryStream.of(map).mapKeyValue(Converter::convert)...
Run Code Online (Sandbox Code Playgroud)
这大约是你能得到的最好的结果。
如果您的方法采用 a作为参数,Converter::convert则该方法将起作用。Map.Entry<String, Integer>我建议不要这样做,因为这会对在非地图上下文中使用转换器产生负面影响。
如果您使用该方法,您的双参数 lambda 建议将起作用Map.forEach,但是它不能用于您正在执行的操作类型。当您取出流时,您已经有了一个Stream<Map.Entry<String, Integer>>. 虽然两个参数的 lambda 在这种情况下可能有意义,但编译器无法知道如何将 a 转换Map.Entry为两个参数。
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |