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.
如果您不反对获取列表的想法,您可以简单地执行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[]在您尝试将其收集到数组中时生成.使用列表至少可以让您维护要将其转换为的类型.
唯一的原始类型的流是IntStream,LongStream和DoubleStream.特别是没有,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)