使用流将booleans的Object []转换为boolean []

dri*_*den 19 java arrays java-stream

我可以用这样的代码进行转换:

Object[] array = (Object[]) message.get(key);
boolean[] result = new boolean[array.length];
for (int i = 0; i < array.length; i++) {
    result[i] = (boolean) array[i];
}
Run Code Online (Sandbox Code Playgroud)

但是,我认为可以使用Java 8流进行相同的转换.我开始编写这样的代码:

boolean[] =  Arrays.stream(array)
                   .map(Boolean.class::cast)
                   .map(Boolean::booleanValue)
                   .toArray()
Run Code Online (Sandbox Code Playgroud)

但是这段代码不起作用.编译说

incompatible types: java.lang.Object[] cannot be converted to boolean[]
Run Code Online (Sandbox Code Playgroud)

我试图了解代码的问题.我认为这map(Boolean::booleanValue)将返回我可以收集的布尔值流toArray.

Dar*_*oid 17

不,因为map(Boolean::booleanValue)扩展到

map((Boolean value) -> (Boolean)value.booleanValue());
Run Code Online (Sandbox Code Playgroud)

(注意编译器插入的自动装箱,因为传递给的函数map()必须返回一个Object,而不是一个boolean)

这就是为什么Java8流包括一大堆的专业类(IntStream,LongStream,和DoubleStream).可悲的是,没有专门的流类boolean.


Mak*_*oto 8

如果您不反对获取列表的想法,您可以简单地执行collect终端操作:

final List<Boolean> boolList = Arrays.stream(array)
                                     .map(Boolean.class::cast)
                                     .map(Boolean::booleanValue)
                                     .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

此处定义的流只能Object[]在您尝试将其收集到数组中时生成.使用列表至少可以让您维护要将其转换为的类型.

  • @JeelShah:是的,但他们可以得到一个`Boolean []`,而不是`boolean []`.如果OP想要`boolean []`,他们必须做更多的工作. (2认同)

Pau*_*ton 6

唯一的原始类型的流是IntStream,LongStreamDoubleStream.特别是没有,BooleanStream并且没有惯用的方法将a转换Stream<Boolean>为a boolean[].

如果您经常需要此功能,可以使用如下的实用程序类:

public final class BooleanUtils {

    private BooleanUtils() {}

    public static boolean[] listToArray(List<Boolean> list) {
        int length = list.size();
        boolean[] arr = new boolean[length];
        for (int i = 0; i < length; i++)
            arr[i] = list.get(i);
        return arr;
    }

    public static final Collector<Boolean, ?, boolean[]> TO_BOOLEAN_ARRAY
         = Collectors.collectingAndThen(Collectors.toList(), BooleanUtils::listToArray);
} 
Run Code Online (Sandbox Code Playgroud)

然后,给定a Stream<Boolean>,您将能够:

boolean[] arr = stream.collect(BooleanUtils.TO_BOOLEAN_ARRAY);
Run Code Online (Sandbox Code Playgroud)