有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用Java streams有条件地设置当前项值?

为了简化我的问题,假设在将这些字符串转换为整数时我有一个字符串列表,我可能会遇到NumberFormatException,从元素中我得到这个异常,我需要将所有后续元素标记为失败一次。有没有更好的方法来传递前一个元素的状态或改进此代码

  AtomicBoolean isInvalidRequest = new AtomicBoolean(false);
  list.stream().map(ele -> {
      if (!isInvalidRequest.get()) {
        try {
          Integer.parseInt(ele);
        } catch (NumberFormatException e) {
          isInvalidRequest = new AtomicBoolean(true);
        }
        return ele;
      } else {
        return "invalid previous element";
      }
    });

给定元素列表List("1", "2", "A", "4", "3")

元素的例外输出List("1", "2", "A", "invalid previous element", "invalid previous element")

编辑

如前所述,这是我实际问题的简化版本。在实际的问题中,我的失败是HTTP POST调用,我需要失败元素中的所有后续元素,我得到一个错误响应


共 (2) 个答案

  1. # 1 楼答案

    在无效元素之后更改元素是一个奇怪的要求。结果是,当只有最后一个元素无效时,根本没有任何变化

    通常,您会对第一个无效元素的索引感兴趣,例如

    OptionalInt firstInvalid = IntStream.range(0, list.size())
            .filter(ix -> {
                try {
                    Integer.parseInt(list.get(ix));
                    return false;
                } catch (NumberFormatException e) {
                    return true;
                }
            })
            .findFirst();
    

    然后,如果您真的想以所描述的方式更改列表,您可以使用

    firstInvalid.ifPresent(ix ->
        list.subList(ix+1, list.size()).replaceAll(s -> "invalid previous element"));
    

    注意,这种关注点的分离使代码更加高效。对第一个无效索引的搜索是短路,在找到第一个无效元素后返回,而不是处理后续元素。然后无条件地将后续元素设置为预定义值。当所有元素都有效时,第一步必须检查所有元素,但第二步将完全跳过

  2. # 2 楼答案

    我使用了这个代码片段

    AtomicBoolean isInvalidRequest = new AtomicBoolean(false);
         ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("A");
        list.add("4");
        list.add("5");
        boolean val = false; 
    
        List<String> newList =  list.stream().map(ele -> {
         if(!isInvalidRequest.get()) {
    
        try{
          Integer.parseInt(ele);
          return ele;
        } catch (Exception e) {
          isInvalidRequest.set(true);
          return "string wrong";
        } 
         } else {
           return "previous string wrong";
         }
      })
      .collect(Collectors.toList());
    
       newList.stream().forEach(ele -> System.out.println(ele)); 
    

    结果是

    1
    2
    string wrong
    previous string wrong
    previous string wrong
    

    但请记住,改变状态或从映射函数内部产生副作用不是一个好主意。所以你可能想改变这一点