如何在不使用boxed().map()的情况下组合两个IntStream并转成对象流?
如何不使用
boxed()实现IntStream的组合流? 现有两个返回IntStream的方法:
static IntStream getKeySizeStream() { return IntStream.of( 128, 192, 256 ); } static IntStream getBlockSizeStream() { return IntStream.of( 128 ); }
需求是定义一个新方法,返回这两个流的组合流,当前实现依赖boxed()完成装箱后再处理:
static Stream<Arguments> getKeySizeAndBlockSizeArgumentsStream() { return getKeySizeStream().boxed().flatMap(ks -> { return getBlockSizeStream() .mapToObj(bs -> Arguments.of(ks, bs)); }); }
可行方案:无需boxed()的实现
完全可以不用boxed(),直接通过IntStream.mapToObj()替代装箱+扁平化的操作,避免不必要的int装箱:
实现代码
static Stream<Arguments> getKeySizeAndBlockSizeArgumentsStream() { return getKeySizeStream() .mapToObj(ks -> getBlockSizeStream().mapToObj(bs -> Arguments.of(ks, bs))) .flatMap(Function.identity()); }
或者更简洁的写法:
static Stream<Arguments> getKeySizeAndBlockSizeArgumentsStream() { return getKeySizeStream() .mapToObj(ks -> getBlockSizeStream().mapToObj(bs -> Arguments.of(ks, bs))) .flatMap(s -> s); }
原理说明
mapToObj()可以直接将每个int类型的密钥长度映射为一个包含该密钥长度与所有块长度组合的Stream<Arguments>,随后通过flatMap()将所有子流合并为一个完整的流,全程不需要对int值进行装箱操作,效率更高。
内容的提问来源于stack exchange,提问作者Jin Kwon
相关产品推荐
相关产品推荐

