Java8流:查找元素之后的第一个元素

Java8流:查找元素之后的第一个元素,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个列表[“z”,“1”,“3”,“x”,“y”,“00”,“x”,“y”,“4”],我需要得到字符串00后的第一个整数元素,在这种情况下4。我正在使用Java8流,但欢迎使用任何其他方法。这是我的起始代码 myList.stream() // Remove any non-Integer characters .filter((str) -> !"x".equals(str) && !"y".equals(str) && !"z

我有一个列表
[“z”,“1”,“3”,“x”,“y”,“00”,“x”,“y”,“4”]
,我需要得到字符串
00
后的第一个
整数
元素,在这种情况下
4
。我正在使用Java8流,但欢迎使用任何其他方法。这是我的起始代码

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

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

可能是一个简单的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
从评论中得到

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

您可以尝试下面的代码

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

    }
}
导入java.util.array;
导入java.util.List;
导入java.util.Optional;
公共班机{
公共静态void main(字符串[]args){
列表=数组。asList(“z”、“1”、“3”、“x”、“y”、“00”、“x”、“y”、“4”);
字符串str=“00”;
可选数据可选=list.stream().skip(list.indexOf(str)+1).过滤器(s->{
试一试{
整数.parseInt(s);
返回true;
}捕获(数字格式异常n){
返回false;
}
}).findFirst();
if(dataOptional.isPresent()){
System.out.println(“数据为::”+dataOptional.get());
}否则{
System.out.println(“给定字符串后不存在整数”);
}
}
}

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

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

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

即使您使用的是字符串而不是
x
y
z
,此解决方案也能提供良好的结果

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

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

流可能不适合在这种情况下使用case@Lebecca我认为这将使我的代码整洁:-)。总之,lemmi寻找另一种方法是“00”是固定的或更改的??为什么不直接获取“00”的索引并使用stream.skip(index).filter(str->isInteger(str)).findFirst()您可以使用
dropWhile
并继续使用Java-9+过滤器,如
mylist.stream().dropWhile(s->!s.equals(“00”).filter…
,但重要的是,问题的陈述是关于获取整数的,并且在模式
00
之后也是如此。我提出的建议这一个有效。谢谢没有想到
skip()
方法。因为这依赖于
List
API,
myList.subList(myList.indexOf(“00”)+1,myList.size()).stream()
会更有效。@Holger我最初的意图和你一样。但是使用流的整个过程更整洁,就像Kihats在评论中所说的那样。事实上,这就是我想要它工作的方式。如果找不到
00
,则应返回列表中的第一个整数,然后。。您可以根据自己的目的使用给定的代码。
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+");
};