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