将列表转换为映射表

3
我有一个字符串列表,想将其转换为映射。我尝试了下面的代码,但似乎无法弄清楚为什么它不起作用。
List<String> dataList = new ArrayList<>( //code to create the list );

Map<String, Double> doubleMap = dataList.stream().collect(Collectors.toMap(o->o, Double::new));

我所得到的仅仅是:

java.lang.NumberFormatException: For input string: "Test1"

似乎试图将一个字符串放进值(其类型为Double)中,而不是创建一个空/空置的double。
我希望这个映射表对于每条记录都包含一个字符串和0.0。
1个回答

6
你试图将一个字符串传递给public Double(String s)构造函数,如果你的列表包含任何无法解析为doubleString,这个构造函数会失败。
当你将Double构造函数的方法引用传递给toMap时,它相当于:
Map<String, Double> doubleMap = dataList.stream().collect(Collectors.toMap(o->o, o->new Double(o)));

取而代之,请写成:
Map<String, Double> doubleMap = dataList.stream().collect(Collectors.toMap(o->o, o->0.0));

很有趣,所以我总是需要传递对象(在这种情况下是o)并指示它向前走? - Aeseir
3
@Aeseir 不,你可以使用方法引用,但是这个引用所引用的方法将会把Stream的元素作为参数(如果它是一个静态方法或者是一个构造函数,就像你代码片段中发生的那样),或者在Stream的每个元素上执行(如果它是一个实例方法)。 - Eran
感谢您的输入,这解决了许多其他问题。 - Aeseir
为每个映射创建代表相同零值的新Double对象毫无意义。虽然o->0.0可能会或可能不会每次创建一个新的Double实例,但构造函数引用肯定会创建一个新的对象。在操作之前进行一次装箱,Double zero=0.0;,然后使用o->zero作为值映射函数可能会更好。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接