以下代码
String[] values = ...
....
Map<String, Object> map = new HashMap<>();
for (int i = 0; i < values.length; i++) {
map.put("X" + i, values[i]);
}
由IntelliJ转换为:
Map<String, Object> map = IntStream.range(0, values.length)
.collect(Collectors.toMap(
i -> "X" + i,
i -> values[i],
(a, b) -> b));
可以缩短为
Map<String, Object> map = IntStream.range(0, values.length)
.collect(Collectors.toMap(
i -> "X" + i,
i -> values[i]));
这两个流版本不编译。
IntelliJ,暗示值中的i存在问题[i]:
不兼容的类型
必需:int找到:java。lang.对象
编译器抱怨:
错误:(35,17)java:接口java中的方法collect。util。流动IntStream不能应用于给定类型
必需:java。util。作用供应商,爪哇。util。作用ObjIntConsumer,java。util。作用找到了双消费者:java。util。流动收藏家
有人能解释为什么吗?
不太确定intelliJ的建议在那里会有什么效果,它似乎不一致。只要放一个
System.out.print(map);
声明和循环之间的语句,然后它不会建议您进一步替换为collect。
使用IntStream collect时,编译失败,原因是实现collect方法需要三个指定的参数在错误中可见,而
Collectors.toMap(i -> "X" + i, i -> values[i])
只会导致收集器类型的单个参数。
转换表达式的更好方法是
>
要么使用foreach
Map<String, Object> map;
IntStream.range(0, values.length).forEach(i -> map.put("X" + i, values[i]));
或者使用box()
将IntStream
转换为Stream
Map<String, Object> map = IntStream.range(0, values.length).boxed()
.collect(Collectors.toMap(i -> "X" + i, i -> values[i], (a, b) -> b));
或者正如@Holger所建议的,您可以避免使用forEach和装箱开销,并修改构造以使用IntStream。将三个参数变量收集为:-
Map<String, Object> map = IntStream.range(0, values.length)
.collect(HashMap::new, (m,i) -> m.put("X"+i,values[i]), Map::putAll);
我有这个代码: 它产生的是 很高兴我应该如何写映射方法来得到一个地图,它会给我:
我有一小段代码,用于计算给定数组中的正值、负值和零值的数量。使用Java 7,通过迭代数组并计算正值、负值和零值的数量,我可以轻松地做到这一点。但对于Java 8流,在map函数中写入条件是否正确?目前,此代码只迭代一次,并跳过数组的其余值。
我想从的中创建一个并在映射中使用相同的parentId映射列表中的所有条目,如。 我使用了但它不编译:
我对构建哈夫曼编码原型感兴趣。为此,我想首先生成一个组成输入Java字符串的字符直方图。我在SO和其他地方看到了许多解决方案(例如:这里依赖于使用流的方法以及函数的静态导入。identity()和收集器。以非常具体和直观的方式计数()。 但是,当使用与我上面链接的代码非常相似的一段代码时: 我从Intellij收到一个编译时错误,它告诉我没有符合供应商类型的参数来收集,这是其签名所要求的: 不幸的
假设你有一张这样的物体地图(尽管想象它更大): rtype=133,有两个! 我想对Streams做的是这样的: 我在理解Collectors&groupBy的工作原理时遇到了一些麻烦,但我想这可能会用于本例。 在Java streams API中进行编码的正确方法是什么? 我很难找到类似的地图例子(人们在他们的例子中更多地使用列表)