IntStream rangeClosed无法返回除int之外的其他值

时间:2018-12-31 06:36:11

标签: java lambda java-8 java-stream

为什么会出现错误?我以为client = boto3.client('sns') response = client.publish( PhoneNumber='some_phone_number', Message='some_message', MessageAttributes = { 'AWS.SNS.SMS.SMSType': { 'DataType': 'String', 'StringValue': 'Promotional' # or 'Transactional' } } ) 可以返回任何值。

map
  

|错误:不兼容的类型:方法参考中的错误返回类型   java.lang.String无法转换为int var s =   IntStream.rangeClosed(1,   5).map(String :: valueOf).collect(Collectors.toList()); |
  ^ ------------- ^

4 个答案:

答案 0 :(得分:14)

使用mapToObj

var s = IntStream.rangeClosed(1, 5).mapToObj(String::valueOf).collect(Collectors.toList());
IntStream中的

map只能将一个int值映射到另一个int值。它接受IntUnaryOperator(接受int并返回int)作为映射器函数,并返回IntStream

另一方面,mapToObj允许您将int值映射到任何引用类型,从而将IntStream转换为Stream<SomeReferenceType>。它接受IntFunction<? extends U>(接受int并返回引用类型)作为映射器函数,并返回Stream<U>

答案 1 :(得分:6)

改为使用mapToObj

IntStream.rangeClosed(1, 5).mapToObj(String::valueOf).collect(Collectors.toList());

答案 2 :(得分:4)

尽管上述答案是正确的,并且mapToObj是惯用的处理方法,但我认为了解问题产生的原因很重要,因此,在将来的情况下,您将知道如何通过以下方法简单地解决问题浏览文档。

当程序员不了解特定方法的工作原理时,深入研究文档是一项非常重要的技能。

因此,让我们看一下相关的流管道操作:

IntStream.rangeClosed根据文档返回IntStream

  

从startInclusive(包含)返回顺序的有序IntStream   以1的增量步长到包容性(包括)。

根据文档,在IntStream上调用map预期会返回IntStream

  

返回由应用给定结果组成的流   对该流的元素起作用。

还有一点很重要,请注意map的方法声明如下:

IntStream map(IntUnaryOperator mapper)

即它需要一个IntUnaryOperator,它实际上表示对单个整数值操作数的操作,该操作数会生成一个整数值的结果

但是,您要传递的函数String::valueOf在我们处理int时会消耗IntStream,并返回String,因此与{{ 1}}和这是问题的原因

每当您想采用原始流专业化并执行某些映射功能,并因此产生IntUnaryOperator时,Stream<R>就是您的最佳选择。

mapToObj声明为:

mapToObj(IntFunction<? extends U> mapper)

mapToObj表示一个接受整数值参数并产生结果的函数,该结果的类型为IntFunction,这意味着您将在{{1之后}}。

答案 3 :(得分:2)

或者,您可以将IntStream.boxed用作:

IntStream

因为var s = IntStream.rangeClosed(1, 5) .boxed() .map(a -> Integer.toString(a)) .collect(Collectors.toList()); 最初是原始整数值元素的序列。


执行此操作的另一种方式是:

a = (1,2,3)
b = a + (5,)