【问题标题】:Java 8 Stream: Find first element after elementJava 8 Stream:在元素之后查找第一个元素
【发布时间】:2020-06-28 07:46:20
【问题描述】:

我有这个列表["z", "1", "3", "x", "y", "00", "x", "y", "4"],在这种情况下,我需要获取字符串00 之后的第一个Integer 元素4。我正在使用 Java 8 流,但欢迎使用任何其他方法。这是我的入门代码

myList.stream()
      // Remove any non-Integer characters
      .filter((str) -> !"x".equals(str) && !"y".equals(str) && !"z".equals(str))
      .findFirst()
      .orElse("");

这让我从删除所有非整数字符串开始,但给了我1。现在我需要得到4,这是00 之后的第一个元素。我应该在过滤器中添加什么?

【问题讨论】:

  • 在这种情况下可能不适合使用流
  • @Lebecca 我认为这将使我的代码整洁:-)。 Anywhoo,lemmi 寻找另一种方式
  • 是“00”是固定的还是变化的??
  • 为什么不直接获取 indexOf "00" 并使用 stream.skip(index).filter(str->isInteger(str)).findFirst()
  • 您可以使用dropWhile 并继续在mylist.stream().dropWhile(s -> !s.equals("00")).filter... 中将过滤器与Java-9+ 一起使用,但重要的是问题陈述是关于获取整数的,而且在模式@987654331 之后也是如此@.

标签: java java-8 java-stream


【解决方案1】:

试试看: 假设你有一个列表

String[] v = {"z", "1", "3", "x", "y", "00", "x", "y", "4", "5", "y", "7"};

现在查找元素之后的第一个元素:

String result = Stream.of(v).filter(e-> e.matches("^(\\d+)")).dropWhile(e-> !e.contains("00")).skip(1).findFirst().orElse("");
System.out.println(result);

【讨论】:

    【解决方案2】:

    如果您此时没有列表的索引。你可以这样做

    int count = 0;
    
    Stream.of("z", "1", "3", "x", "y", "00", "98", "y", "4")
    .peek(element -> {
        if (element.equals("00") || count > 0 && isNumber(element))
            count++;
    }).filter(element -> isNumber(element) && count == 3).findFirst().orElse(null);
    
    private boolean isNumber(String element) {
        return element.matches("\\d+");
    };
    

    【讨论】:

      【解决方案3】:

      您可以使用streams

      String result=myList.subList(myList.indexOf("00")+1, myList.size()).stream().filter(string->string.matches("\\d+")).findFirst().get();
      

      即使您使用的是字符串而不是 xyz,此解决方案也会为您提供良好的结果。

      【讨论】:

        【解决方案4】:

        你可以试试下面的代码。

        import java.util.Arrays;
        import java.util.List;
        import java.util.Optional;
        
        public class Main {
        
            public static void main(String[] args) {
        
                List<String> list = Arrays.asList("z", "1", "3", "x", "y", "00", "x", "y", "4");
        
                String str = "00";
        
                Optional<String> dataOptional = list.stream().skip(list.indexOf(str)+1).filter(s -> {
                    try {
                        Integer.parseInt(s);
                        return true;
                    } catch (NumberFormatException n) {
                        return false;
                    }
                }).findFirst();
        
                if (dataOptional.isPresent()) {
                    System.out.println("Data is :: " + dataOptional.get());
                } else {
                    System.out.println("No integer present after given string");
                }
        
            }
        }
        

        确保 str 存在于列表中,否则它将返回列表中的第一个整数。

        【讨论】:

        • 实际上,这就是我希望它的工作方式。如果找不到00,则应返回列表中的第一个整数
        • 那太好了。你可以使用给定的代码来达到你的目的。
        【解决方案5】:
        int index = myList.indexOf("00");
        String result =myList.stream.skip(index).filter(str->isInteger(str)).findFirst().orElse(null);
        
        private boolean isInteger(String str){
         try{
           Integer.parseInt(str);
           return true;
         } catch (NumberFormatException e) {
           return false;
         }
         }
        

        【讨论】:

          【解决方案6】:

          从评论中得到。

           String result = myList.stream().skip(myList.indexOf("00") + 1)
                  .filter((str) -> !"x".equals(str) && !"y".equals(str) && !"z".equals(str))
                  .findFirst()
                  .orElse("");
          

          【讨论】:

          • somwhat like the dropWhile 我提出的建议
          • 这个有效。谢谢。没想到skip()这个方法。
          • 因为无论如何这都依赖于List API,所以myList.subList(myList.indexOf("00") + 1, myList.size()) .stream() 会更高效。
          • @Holger 我的初衷和你一样。但是使用流整个过程更像neat and tidy,正如 Kihats 在 cmets 中所说的那样。
          【解决方案7】:

          也许是一个简单的 for 循环。 lot 比流表达式更具可读性,也更通用,因为像 'x''y' 这样的字符串没有硬编码到其中.

          boolean found00 = false;
          int intAfter00 = -1;
          for(String str: myList) {
              if("00".equals(str)) {
                 found00 = true; //from this point we look for an integer
                 continue;
              }
              if(found00) { //looking for an integer
                 try {
                     intAfter00 = Integer.parseInt(str);
                 } catch(Exception e) {
                    continue; //this was not an integer
                 }
                 break;
              }
          }
          //If intAfter00 is still -1 here then we did not found an integer after 00
          

          【讨论】:

            猜你喜欢
            • 2017-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-31
            • 1970-01-01
            • 2017-12-27
            • 2019-11-17
            相关资源
            最近更新 更多