Java8整数流与IntStream

时间:2018-07-24 18:25:42

标签: java java-8 java-stream

使用以下代码,我得到下面的编译错误。我还尝试使用输入作为Integer列表而不是int [],并且它可以正常工作。如果我使用boxed(),它也可以正常工作。

我的问题确实是,如果Int Stream是否必须是Integer流,以及处理错误消息“ lambda表达式int []中的错误返回类型无法转换为int”的错误处理是什么

public static void main(String[] args) {
    int[] numbers = {1,2,3,4};

    List<int[]> result1 = Arrays.stream(numbers).flatMap(chara -> Arrays.stream(numbers)
            .map(operand -> new int[]{1, 2})).collect(Collectors.toList());
}
  

错误:(13,49)java:不兼容的类型:lambda中的返回类型错误   表达       int []无法转换为int错误:(13,66)java:接口java.util.stream.IntStream中的方法collection无法应用于   给定类型;需要:   java.util.function.Supplier,java.util.function.ObjIntConsumer,java.util.function.BiConsumer   找到:java.util.stream.Collector>原因:无法推断   类型变量R       (实际和正式论点列表的长度不同)

1 个答案:

答案 0 :(得分:5)

  

我还尝试使用输入作为整数列表,而不是int[]和   与它工作正常。如果我使用boxed()也可以正常工作

所以,这实际上意味着您已经尝试过:

List<int[]> result1 = numbers.stream() 
                             .flatMap(chara -> numbers.stream()
                             .map(operand -> new int[]{1, 2}))
                             .collect(Collectors.toList());

给定的数字是List<Integer>

和:

List<int[]> result1 = Arrays.stream(numbers)
                            .boxed()
                            .flatMap(chara -> Arrays.stream(numbers).boxed()
                            .map(operand -> new int[]{1, 2}))
                            .collect(Collectors.toList());

给定的数字是int[]

是的,它确实可以编译,但是根本不可读,并且肯定有更好的方法来生成相同的结果(在后面的文章中显示)。

至于编译错误,这是因为Arrays.stream(numbers)生成了IntStream,而您试图将map改为引用类型(int[])而不是原始的{ int的功能所期望的{1}}。即使您通过执行IntStream#map来解决该问题,也仍然会遇到另一个问题。

您的代码几乎是这样做的:

Arrays.stream(numbers).boxed()..

或:

Stream.generate(() -> new int[]{1, 2})
      .limit(numbers.length * numbers.length)
      .collect(Collectors.toList());

,但以习惯用法可读有效的方式。