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>
包装int
s的结果,但这是可以的,因为你要将它们发送到一个List
.如果你不打算盒子int
值成List
,你可以转换Stream<OptionalInt>
到IntStream
使用下列内容:
flatMapToInt(o -> o.isPresent() ? IntStream.of(o.getAsInt()) : IntStream.empty())
Run Code Online (Sandbox Code Playgroud)
有关处理选项流的进一步讨论,请参阅此问题及其答案.
归档时间: |
|
查看次数: |
46868 次 |
最近记录: |