我有这个代码,我想在Java 8风格中看到它:
List<Double> outcome = ....
int step = data.size / 20;
for (int i = 0; i < 20; i++) {
Instance inst = data.get(i * step).getInstance();
if (inst.isPresent())
outcome.add(100);
else
outcome.add(0.0);
对我来说,很容易将代码转换为Java 8流,但我不知道如何实现data.get(i * step)
部分。
答案 0 :(得分:5)
您可以使用IntStream
,它是“一系列支持顺序和并行聚合操作的原始int值元素”。
例如:
IntStream.range(0, 20)
.forEach(i -> {
Instance inst = data.get(i * step).getInstance();
outcome.add(inst.isPresent() ? 100d : 0d);
});
作为@AlexisC。建议,这可以简化为单行:
List<Double> outcome =
IntStream.range(0, 20)
.mapToObj(i -> data.get(i*step).getInstance().isPresent()? 100d : 0d)
.collect(toList());
答案 1 :(得分:2)
这是一个替代解决方案,它不会改变列表但使用收集器(通常建议在使用流时使用无副作用的代码,特别是如果您将来可以并行化它们):
List<Double> outcome = IntStream.range(0, 20)
.mapToObj(i -> data.get(i * step).getInstance())
.map(inst -> inst.isPresent() ? 100d : 0d)
.collect(toList());