Java 在使用forEach函数时,消费者的accept函数中传递的参数混乱

Java 在使用forEach函数时,消费者的accept函数中传递的参数混乱,java,Java,如果我为创建为的列表调用forEach函数 Collection.singletonList或Arrays.asList, forEach函数中所需的Consumer函数accept所需的参数类型为int[]表示新int[]{}或Integer[]表示新整数[]{} 似乎数组的每个元素都像大小为1的数组一样被传递。所以,当我打印Arrays.toStringx这样的值时,x的类型是int[],它工作正常 Collections.singletonList(new int[] {1, 2, 3})

如果我为创建为的列表调用forEach函数 Collection.singletonList或Arrays.asList, forEach函数中所需的Consumer函数accept所需的参数类型为int[]表示新int[]{}或Integer[]表示新整数[]{}

似乎数组的每个元素都像大小为1的数组一样被传递。所以,当我打印Arrays.toStringx这样的值时,x的类型是int[],它工作正常

Collections.singletonList(new int[] {1, 2, 3})
               .forEach(new Consumer<int[]>() {
    @Override
    public void accept(int[] o) {
        System.out.println(o);
    }
});
为什么所需参数的类型为int[]而不是int

Collection.singletonList会创建一个包含一个元素的列表(在您的示例中是一个数组)。我想你想要达到的是

Arrays.asList(1, 2, 3).forEach(new Consumer<Integer>() {
    @Override
    public void accept(Integer o) {
        System.out.println(o);
    }
});
正如名称所述,Collection.singletonList创建了一个包含一个元素的列表——在您的示例中是一个数组。我想你想要达到的是

Arrays.asList(1, 2, 3).forEach(new Consumer<Integer>() {
    @Override
    public void accept(Integer o) {
        System.out.println(o);
    }
});

您构建列表的方式不正确。实际上,您创建了一个单例列表,即仅包含一个元素的列表,并且该唯一元素的类型为int[]

注:消费者也可用于lambda或方法参考:

        Stream.of(1,2,3).forEach(System.out::println);

您构建列表的方式不正确。实际上,您创建了一个单例列表,即仅包含一个元素的列表,并且该唯一元素的类型为int[]

注:消费者也可用于lambda或方法参考:

        Stream.of(1,2,3).forEach(System.out::println);

因为您创建了一个单例列表,即仅包含一个元素的列表,并且该唯一元素的类型为int[]。当创建一个匿名类来实现一个专门用于功能接口的接口时,这很奇怪……可能相关:请特别参阅Jon Skeet的答案@Benoit。如果我使用Arrays.asList而不是Collections.singletonList,则其行为相同。因为您创建了一个单例列表,即仅包含一个元素的列表,唯一的元素是int[]类型。当创建一个匿名类来实现一个接口时,这很奇怪,这个接口特别是功能接口…可能相关:特别是Jon Skeet的答案@Benoit,如果我使用Arrays.asList而不是Collections.singletonlist,它的行为是相同的,毕竟List.of1、2、3.forEachSystem.out::println这是Java-9的另一个实现。我只是想知道为什么它以int[]作为输入。看起来像IntStream.ofnew int[]{1,2,3}。boxed.forEachSystem.out::println这一定是唯一的方法。我知道这是可以做到的,毕竟List.of1,2,3.forEachSystem.out::println这是来自Java-9的另一个实现。我只是想知道为什么它将int[]作为输入。看起来像IntStream.ofnew int[]{1,2,3}.boxed.forEachSystem.out::println这必须是唯一的方法。看起来像Collections.singletonList和Arrays.asList都为数组的每个元素创建一个大小为1的数组。这一定是因为这些功能的实现。我应该坚持使用IntStream.range1,4.boxed.forEachSystem.out::println.No,Arrays.asList创建元素列表,其中每个元素都具有传递到Arrays.asList的类型。Collections.singletonList1是Arrays.asList1的快捷方式/简化方式。看起来像Collections.singletonList和Arrays.asList都为数组的每个元素创建一个大小为1的数组。这一定是因为这些功能的实现。我应该坚持使用IntStream.range1,4.boxed.forEachSystem.out::println.No,Arrays.asList创建元素列表,其中每个元素都具有传递到Arrays.asList的类型。Collections.singletonList1是Arrays.asList1的快捷方式/简化。