我知道如何“转换”一个简单的Java列表从Y -> Z,即:
List<String> x;
List<Integer> y = x.stream()
.map(s -> Integer.parseInt(s))
.collect(Collectors.toList());
现在我想对Map做基本相同的事情,即:
INPUT:
{
"key1" -> "41", // "41" and "42"
"key2" -> "42" // are Strings
}
OUTPUT:
{
"key1" -> 41, // 41 and 42
"key2" -> 42 // are Integers
}
解决方案不应局限于String -> Integer。就像上面的List示例一样,我想调用任何方法(或构造函数)。
尽管可以在流的collect部分重新映射键或/和值,如其他答案所示,但我认为它应该属于map部分,因为该函数被设计用于转换流中的数据。其次,它应该易于重复,而不会引入额外的复杂性。可以使用SimpleEntry对象,该对象自Java 6以来已经可用。
使用java8
import java.util.AbstractMap.SimpleEntry;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
public class App {
public static void main(String[] args) {
Map<String, String> x;
Map<String, Integer> y = x.entrySet().stream()
.map(entry -> new SimpleEntry<>(entry.getKey(), Integer.parseInt(entry.getValue())))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
}
}
使用Java 9+
随着Java 9的发布,Map接口内引入了一个静态方法,以便更容易地创建一个条目,而不需要实例化一个新的SimpleEntry,如前面的示例所示。
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
public class App {
public static void main(String[] args) {
Map<String, String> x;
Map<String, Integer> y = x.entrySet().stream()
.map(entry -> Map.entry((entry.getKey(), Integer.parseInt(entry.getValue())))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
}
}