Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';当从数组流式传输时,我是否将整数映射到字符串?_Java_Functional Programming_Java 8_Java Stream - Fatal编程技术网

Java 为什么可以';当从数组流式传输时,我是否将整数映射到字符串?

Java 为什么可以';当从数组流式传输时,我是否将整数映射到字符串?,java,functional-programming,java-8,java-stream,Java,Functional Programming,Java 8,Java Stream,这段代码有效(取自Javadoc): IDEA告诉我“lambda表达式中有一个不兼容的返回类型字符串” 为什么??如何解决这个问题呢?数组.stream(int[])创建一个IntStream,而不是流。因此,在将int映射到对象时,需要调用而不仅仅是map 这应该如预期的那样起作用: String commaSeparatedNumbers = Arrays.stream(numbers) .mapToObj(i -> ((Integer) i).toString()) //i

这段代码有效(取自Javadoc):

IDEA告诉我“lambda表达式中有一个不兼容的返回类型字符串”

为什么??如何解决这个问题呢?

数组.stream(int[])
创建一个
IntStream
,而不是
流。因此,在将
int
映射到对象时,需要调用而不仅仅是
map

这应该如预期的那样起作用:

String commaSeparatedNumbers = Arrays.stream(numbers)
    .mapToObj(i -> ((Integer) i).toString()) //i is an int, not an Integer
    .collect(Collectors.joining(", "));
你也可以写:

String commaSeparatedNumbers = Arrays.stream(numbers)
    .mapToObj(Integer::toString)
    .collect(Collectors.joining(", "));
Arrays.stream(numbers)
在引擎盖下创建一个
IntStream
,而
IntStream
上的映射操作需要一个
IntUnaryOperator
(即一个函数
int->int
)。要应用的映射函数不遵守此约定,因此存在编译错误

您需要在之前调用
boxed()
,以获取
流(这是
Arrays.asList(…).Stream()
返回的内容)。然后像在第一个代码片段中那样调用
map

请注意,如果需要
boxed()
后跟
map
,则可能需要直接使用
mapToObj


优点是
mapToObj
不需要将每个
int
值都框到
Integer
对象中;当然,这取决于您应用的映射函数;因此,我会使用这个选项,它的编写时间也更短。

您可以使用Arrays.Stream(int[])创建一个整数流,您可以调用
mapToObj
mapToObj(Integer::toString)


希望这对您有所帮助。

如果此示例和问题的目的是了解如何将字符串映射到int流(例如,使用int流访问字符串数组中的索引),您也可以使用装箱,然后强制转换为int(这将允许访问数组的索引)

.boxed()调用将IntStream(一个基本int流)转换为一个流(一个对象流——即整数对象),然后该流将接受lambda返回的对象(在本例中是字符串对象)。在这里,它只是一个用于演示的数字的字符串表示形式,但它也可以很容易(更实际)成为任何字符串对象——就像前面提到的字符串数组的元素一样

我只是想提供另一种可能性。在编程中,完成一项任务总是有多种方法。尽可能多地了解,然后选择最适合手头任务的一个,记住性能问题、直观性、代码清晰性、您对编码风格的偏好以及最自我记录


快乐编码

没有装箱、AFAIK,也没有添加到堆中的小字符串爆炸:

public static void main(String[] args) {
    IntStream stream = IntStream.of(1, 2, 3, 4, 5, 6);
    String s = stream.collect(StringBuilder::new, (builder, n) -> builder.append(',').append(n), (x, y) -> x.append(',').append(y)).substring(1);
    System.out.println(s);
}

IntStream
Stream
之间有什么区别?@FlorianMargaine An
IntStream
是对原始
int
值的流专门化。
Stream
只是一个包含
Integer
对象的流。@FlorianMargaine
IntStream
是一个流或原语(ints),而
Steram
是一个对象流。出于性能原因,原始流有专门的方法。
IntStream.mapToObj
需要一个
IntFunction
,这是一个使用
int
值的函数 
.mapToObj((整数i)->i.toString())
不起作用。无论如何,不建议使用它,因为它包含从
int
Integer
的不必要转换。相反,
.mapToObj(Integer::toString)
工作得很好,因为它将调用
静态
方法
Integer.toString(int)
。请注意,这与在服务器上调用
.map(Integer::toString)
不同 <代码>流
因为后者不明确,所以无法编译。@cic:no,在
上调用
.map(Integer::toString)
确实不明确,因为
.map(i->i.toString())
.map(i->Integer.toString(i))
都是有效的。但是,使用
.map(Object::toString)
很容易解决这个问题。您正在做不必要的工作。将每个
int
装箱到其包装类型
Integer
,然后将其取消装箱。
String commaSeparatedNumbers = Arrays.stream(numbers)
    .mapToObj(Integer::toString)
    .collect(Collectors.joining(", "));
String csn = Arrays.stream(numbers) // your numbers array
.mapToObj(Integer::toString)
.collect(Collectors.joining(", "));
int[] numbers = {0, 1, 2, 3}; 
String commaSeparatedNumbers = Arrays.stream(numbers)
    .boxed()
    .map((Integer i) -> Integer.toString((int)i))
    .collect(Collectors.joining(", "));
public static void main(String[] args) {
    IntStream stream = IntStream.of(1, 2, 3, 4, 5, 6);
    String s = stream.collect(StringBuilder::new, (builder, n) -> builder.append(',').append(n), (x, y) -> x.append(',').append(y)).substring(1);
    System.out.println(s);
}