GVKun编程网logo

在流中使用 Java 8 foreach 循环移至下一项(java中流的使用)

10

关于在流中使用Java8foreach循环移至下一项和java中流的使用的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于c#–我什么时候才能在原生foreach循环中使用List.ForE

关于在流中使用 Java 8 foreach 循环移至下一项java中流的使用的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于c# – 我什么时候才能在原生foreach循环中使用List.ForEach?、For 循环 - 查找现有匹配项并移至下一种匹配项、Foreach 循环到流中、For循环到Java 8 Stream forEach()等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

在流中使用 Java 8 foreach 循环移至下一项(java中流的使用)

在流中使用 Java 8 foreach 循环移至下一项(java中流的使用)

我对 Java 8 foreach 流尝试移动到循环中的下一个项目时遇到问题。我不能像
一样设置命令continue;,只能return;工作,但在这种情况下你会退出循环。我需要继续循环中的下一个项目。我怎样才能做到这一点?

示例(不工作):

try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){            filteredLines = lines.filter(...).foreach(line -> {           ...           if(...)              continue; // this command doesn''t working here    });}

示例(工作):

try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){    filteredLines = lines.filter(...).collect(Collectors.toList());}for(String filteredLine : filteredLines){   ...   if(...)      continue; // it''s working!}

答案1

小编典典

使用return;会很好。它不会阻止完整循环的完成。它只会停止执行forEach循环的当前迭代。

试试下面的小程序:

public static void main(String[] args) {    ArrayList<String> stringList = new ArrayList<>();    stringList.add("a");    stringList.add("b");    stringList.add("c");    stringList.stream().forEach(str -> {        if (str.equals("b")) return; // only skips this iteration.        System.out.println(str);    });}

输出:

一个
_

注意迭代return;是如何执行的b,但是c在接下来的迭代中打印就好了。

为什么这行得通?

这种行为起初看起来不直观的原因是因为我们习惯了return中断整个方法执行的语句。所以在这种情况下,我们期望main方法执行作为一个整体被停止。

但是,需要理解的是一个lambda表达式,比如:

str -> {    if (str.equals("b")) return;    System.out.println(str);}

…确实需要将其视为自己独特的“方法”,与main方法完全分开,尽管它位于其中很方便。所以实际上,该return语句只会停止 lambda
表达式的执行。

需要理解的第二件事是:

stringList.stream().forEach()

…实际上只是一个普通的循环,它为每次迭代执行 lambda 表达式。

考虑到这两点,上面的代码可以用以下等效方式重写(仅用于教育目的):

public static void main(String[] args) {    ArrayList<String> stringList = new ArrayList<>();    stringList.add("a");    stringList.add("b");    stringList.add("c");    for(String s : stringList) {        lambdaExpressionEquivalent(s);    }}private static void lambdaExpressionEquivalent(String str) {    if (str.equals("b")) {        return;    }    System.out.println(str);}

使用这种“不那么神奇”的代码等效项,return语句的范围变得更加明显。

c# – 我什么时候才能在原生foreach循环中使用List.ForEach?

c# – 我什么时候才能在原生foreach循环中使用List.ForEach?

两种方法都有优势吗?如果我需要遍历List项并对每个项执行操作,我应该使用传统的foreach循环机制还是继续使用List.ForEach?

Matthew Podwysocki @ CodeBetter.com写了一篇关于anti-for campaign的有趣文章.这让我想到了循环试图解决的问题.在本文中,Matthew认为显式循环结构会让你思考“如何”而不是“什么”.

使用一个优于另一个(如果有的话)有什么好的理由?

解决方法

首先,如果你因为某种原因被传递给代表,你就会使用它.例如,您可以创建自己的列表,填充它等,然后将委托应用于每个条目.那时,写作:

list.ForEach(action);

比…更简单

foreach (Item item in list)
{
    action(item);
}

For 循环 - 查找现有匹配项并移至下一种匹配项

For 循环 - 查找现有匹配项并移至下一种匹配项

如何解决For 循环 - 查找现有匹配项并移至下一种匹配项?

嗨,我可以帮助我为我正在构建的函数创建逻辑。

背景:我想推荐3款与当前车型匹配的车辆。问题是,有时只有 1 或 2 种其他车辆类型与现有车辆类型匹配。在这种情况下,我想运行一个循环,抓取与当前类型匹配的两辆车,然后抓取不匹配的最高价格的车辆。

如何告诉我的 for 循环,当它遇到所有匹配的车辆类型时,移动到下一个车辆类型并获取最昂贵的?

var currentType = "SUV";
var myArray = [
0: {index: 8,type: "SUV",value: 932.2}
1: {index: 6,type: "Sedan",value: 749.12}
2: {index: 7,value: 641.3}
3: {index: 5,value: 621.24}
4: {index: 9,value: 591.14}
5: {index: 10,value: 568.57}
6: {index: 2,value: 420.61}
7: {index: 4,value: 415.6}
8: {index: 3,value: 415.6}
9: {index: 1,value: 410.58}
10: {index: 0,value: 410.58}
]

for(i=0; i<myArray.length''i++){
  if(myArray[i].type === currentType){
    //grab those vehicles and do X
  }else{
    //grab the most expensive vehicle of some other type
  }


}

提前致谢!

解决方法

这是一种方法 - 过滤匹配类型的列表,然后(如果需要)从其余部分反向过滤、排序和切片您需要的内容。

const myArray = [
{index: 8,type: "SUV",value: 932.2},{index: 6,type: "Sedan",value: 749.12},{index: 7,value: 641.3},{index: 5,value: 621.24},{index: 9,value: 591.14},{index: 10,value: 568.57},{index: 2,value: 420.61},{index: 4,value: 415.6},{index: 3,{index: 1,value: 410.58},{index: 0,value: 410.58}].sort((a,b) => a.value > b.value);

const getMatch = type => {
  let matches = myArray.filter(e => e.type === type);
  if (matches.length < 3) matches = matches.concat(myArray.filter(e => e.type !== type).slice(0,3 - matches.length))
  return matches
}

console.log(getMatch(''SUV''))

,

这可能不是最有效的方法,但我相信它非常易读。它也没有使用循环,但如果这是一个要求,我相信读者可以成功翻译。

我还从示例中假设 myArray 默认按成本排序。

var onlyType = myArray.filter(x => x.type == currentType) //filter by type
if(onlyType.length > 3)
  onlyType.length = 3 //truncate
else if(onlyType.length < 3)
  onlyType = onlyType.concat(myArray.slice(0,3 - onlyType.length)) //add the missing

Foreach 循环到流中

Foreach 循环到流中

虽然我没有得到确切的问题陈述,但您可以尝试这种可能正在寻找的嵌套 foreach 循环。 希望能帮到你。

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        List<PickOrder> pickedOrders = Arrays.asList(
           new PickOrder("pc1",1000),new PickOrder("pc2",2000),new PickOrder("pc3",3000),new PickOrder("pc4",4000),new PickOrder("pc5",5000)
        );

        List<PickOrder> pickOrders = Arrays.asList(
                new PickOrder("pc6",6000),new PickOrder("pc7",7000),new PickOrder("pc8",8000)
        );

        Map<String,Integer> removedProducts = new HashMap<>();
        removedProducts.put("pc1",1000);
        removedProducts.put("pc2",2000);
        removedProducts.put("pc3",3000);

        pickOrders.forEach( pickOrder -> removedProducts.keySet().forEach(rp -> {
            if(pickOrder.getProductCode().equals(rp)) {
                //pickOrder.calcReplenishmentsNeeded(quantityOnHand);
                /*if (error) {
                    System.out.println("Recalculating: " + pickOrder);
                }*/
            }
        }));
    }

PickOrder.java

public class PickOrder {

    private String productCode;
    private int quantity;

    public PickOrder(String productCode,int quantity) {
        this.productCode = productCode;
        this.quantity = quantity;
    }

    public String getProductCode() {
        return productCode;
    }

    public void setProductCode(String productCode) {
        this.productCode = productCode;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }
}

谢谢 格达尔

For循环到Java 8 Stream forEach()

For循环到Java 8 Stream forEach()

参见英文答案 > Break or return from Java 8 stream forEach?                                    11个
我有一个for循环的列表,用于检查db中是否存在索引值.

如果任何值不存在,它会立即返回false.

public boolean exists(List<String> keys) {
     for(String key: keys) {
         boolean exists = service.existsByKey(key);
         if(!exists) return false;
      }
        return true;
}

我试图将它改为java 8 foreach,但它没有按预期工作.

keys.stream().forEach(k -> {
    boolean exists = service.existsByKey(k);
    if(!exists) return false;
});

我错过了什么吗?为什么不进入forEach()中的(!exists)staetment?

解决方法

您的forEach方法中的return语句将被忽略.

尝试使用

boolean exists = key.stream().allMatch(k -> service.existsByKey(k));

关于在流中使用 Java 8 foreach 循环移至下一项java中流的使用的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于c# – 我什么时候才能在原生foreach循环中使用List.ForEach?、For 循环 - 查找现有匹配项并移至下一种匹配项、Foreach 循环到流中、For循环到Java 8 Stream forEach()等相关知识的信息别忘了在本站进行查找喔。

本文标签:

上一篇Maven 检查存储库中更新的依赖项(检查maven环境)

下一篇如何将文本文件的内容加载到 javascript 变量中?(怎么将js文件加载到html文件)