使用流将布尔值的对象 [] 转换为布尔值 []

2022-09-02 00:44:11

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

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];
}

但是,我认为使用Java 8流进行相同的转换是可能的。我开始编写如下代码:

boolean[] =  Arrays.stream(array)
                   .map(Boolean.class::cast)
                   .map(Boolean::booleanValue)
                   .toArray()

但是此代码不起作用。编译器 说

incompatible types: java.lang.Object[] cannot be converted to boolean[]

我试图理解代码的问题是什么。我认为这将返回一系列布尔值,我可以用 收集 。map(Boolean::booleanValue)toArray


答案 1

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

map((Boolean value) -> (Boolean)value.booleanValue());

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

这就是为什么 Java8 流包含一大堆专用类 (, 、 和 )。可悲的是,没有专门的流类。IntStreamLongStreamDoubleStreamboolean


答案 2

唯一的基元类型流是 、 和 。特别是没有,也没有将 a 转换为 .IntStreamLongStreamDoubleStreamBooleanStreamStream<Boolean>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);
} 

然后,给定一个 ,您将能够执行以下操作:Stream<Boolean>

boolean[] arr = stream.collect(BooleanUtils.TO_BOOLEAN_ARRAY);