Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将此代码片段变形为Java8,其中逻辑取决于索引值?_Java_Collections_Java 8 - Fatal编程技术网

如何将此代码片段变形为Java8,其中逻辑取决于索引值?

如何将此代码片段变形为Java8,其中逻辑取决于索引值?,java,collections,java-8,Java,Collections,Java 8,我有一段代码,我希望在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版本中看到它:

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);
列表结果=。。。。
int step=data.size/20;
对于(int i=0;i<20;i++){
Instance inst=data.get(i*step).getInstance();
if(inst.isPresent())
结果.增加(100);
其他的
结果:增加(0.0);

对我来说,将代码转换成Java 8流很容易,但我不知道如何实现
data.get(I*step)
部分。

您可以使用
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());
列表结果=
IntStream.range(0,20)
.mapToObj(i->data.get(i*step).getInstance().isPresent()?100d:0d)
.collect(toList());

您可以使用
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());
列表结果=
IntStream.range(0,20)
.mapToObj(i->data.get(i*step).getInstance().isPresent()?100d:0d)
.collect(toList());

这里有一个替代解决方案,它不改变列表,而是使用收集器(在使用流时,通常建议使用无副作用的代码,特别是在将来可能并行它们的情况下):

List output=IntStream.range(0,20)
.mapToObj(i->data.get(i*step).getInstance())
.map(安装->安装显示()?100d:0d)
.collect(toList());

这里有一个替代解决方案,它不改变列表,而是使用收集器(在使用流时,通常建议使用无副作用的代码,特别是在将来可能并行它们的情况下):

List output=IntStream.range(0,20)
.mapToObj(i->data.get(i*step).getInstance())
.map(安装->安装显示()?100d:0d)
.collect(toList());

…或
列表结果=IntStream.range(0,20).mapToObj(i->data.get(i*step).getInstance().isPresent()?100d:0d).collect(toList())
对于一行程序。很好,@AlexisC。谢谢你的注释:)@AlexisC。而且,这很漂亮!你能把它添加为答案以供将来参考吗?@Chiron assylias已经用一个稍微不同的版本发布了它;映射操作在他的答案中被拆分了……或者
List output=IntStream.range(0,20)。mapToObj(i->data.get)(i*step).getInstance().isPresent()?100d:0d).collect(toList());
对于一行程序。很好,@AlexisC。谢谢你的提示:)@阿列克西斯。还有,那太好了!你能把它作为答案添加到以后的参考吗?@Chiron assylias已经用了一个稍微不同的版本发布了它;地图操作在他的答案中被拆分了。真的谢谢。我希望我能选择两个被接受的答案。我同意你的解决方案:)真的谢谢。我希望我能选择两个答案pted答案。我同意你的解决方案:)