Java 8 Stream:在元素之后查找第一个元素

时间:2020-03-17 08:37:14

标签: java java-8 java-stream

我有此列表["z", "1", "3", "x", "y", "00", "x", "y", "4"],在这种情况下,我需要获取字符串Integer之后的第一个00元素,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。我应该在过滤器中添加什么?

6 个答案:

答案 0 :(得分:4)

评论中的内容。

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

答案 1 :(得分:2)

也许是一个简单的for循环。比流表达式更易读的很多,也更通用,因为'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

答案 2 :(得分:1)

您可以尝试以下代码。

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存在于列表中,否则它将返回列表中的第一个整数。

答案 3 :(得分:0)

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;
 }
 }

答案 4 :(得分:0)

您可以使用streams执行以下操作:

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

即使您使用的是字符串而不是xyz,该解决方案也可以为您带来良好的结果。

答案 5 :(得分:0)

如果您现在没有列表索引。你可以做这样的事情

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+");
};