Mar*_*ian 25 java map java-8 java-stream
使用Java 8流,当输入Integer没有输出时,映射a 的最佳方法是什么List<Integer>?
只需返回null?但现在我的输出列表大小将小于我的输入大小...
List<Integer> input = Arrays.asList(0,1,2,3);
List<Integer> output = input.stream()
.map(i -> {
Integer out = crazyFunction(i);
if(out == null || out.equals(0))
return null;
return Optional.of(out);
})
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
Hol*_*ger 50
我不明白为什么你(以及所有的答案)让它变得如此复杂.您有映射操作和过滤操作.所以最简单的方法就是一个接一个地应用这些操作.除非你的方法已经返回Optional,否则没有必要处理Optional.
input.stream().map(i -> crazyFunction(i))
.filter(out -> out!=null && !out.equals(0))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
它可以简化为
input.stream().map(context::crazyFunction)
.filter(out -> out!=null && !out.equals(0))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是你似乎有更多的理论问题,关于List生成什么样的类型,一个是缺少值的占位符,另一个是与输入列表不同的大小.
简单的答案是:不生成列表.一个List不以自身为目的,所以你应该考虑什么样的操作,你需要这个名单(或内容),并申请经营权作为流的终端操作.然后你得到答案,因为操作规定是否应该过滤掉缺席值或用特殊值表示(以及必须是什么值).
对于不同的操作,它可能是一个不同的答案......
Stu*_*rks 31
替换map呼叫flatMap.该map操作为每个输入值产生一个输出值,而该flatMap操作产生每个输入值的任意数量的输出值 - 包括零.
最简单的方法可能是更换支票,如下所示:
List<Integer> output = input.stream()
.flatMap(i -> {
Integer out = crazyFunction(i);
if (out == null || out.equals(0))
return Stream.empty();
else
return Stream.of(out);
})
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
进一步的重构可能会改变crazyFunction,让它返回Optional(可能OptionalInt).如果你打电话给它map,结果是a Stream<OptionalInt>.然后你需要flatMap该流来删除空的选项:
List<Integer> output = input.stream()
.map(this::crazyFunctionReturningOptionalInt)
.flatMap(o -> o.isPresent() ? Stream.of(o.getAsInt()) : Stream.empty())
.collect(toList());
Run Code Online (Sandbox Code Playgroud)
这个结果flatMap是一个Stream<Integer>包装ints的结果,但这是可以的,因为你要将它们发送到一个List.如果你不打算盒子int值成List,你可以转换Stream<OptionalInt>到IntStream使用下列内容:
flatMapToInt(o -> o.isPresent() ? IntStream.of(o.getAsInt()) : IntStream.empty())
Run Code Online (Sandbox Code Playgroud)
有关处理选项流的进一步讨论,请参阅此问题及其答案.