鉴于您已经说过要查找列表中包含“E”的第一个项目,根据定义,您必须遍历每个项目以检查它们,直到找到匹配项 - 这可能在最后列表,所以在最坏的情况下,您仍然必须搜索整个列表。
但是,您可以采取的一种捷径是至少在找到您感兴趣的那个后立即退出循环:
for (String a : test) {
if(a.contains("E")) {
System.out.println(test.indexOf(a));
break;
}
}
如果您正在搜索一个完整的字符串(例如“ABC”),您可以使用 indexOf,但是当您正在搜索部分匹配时,您不能这样做。
Java 8 语法虽然不太可能提高性能或以更少的代码行执行操作,但可以说更具可读性,并且允许您链接其他流操作以对匹配的项目执行任何您需要执行的操作查询:
List<String> list = Arrays.asList("ABC", "DEF", "GHI", "JKL");
Optional<String> matchingItem = list.stream()
.filter(s -> s.contains("E"))
.findFirst();
matchingItem.ifPresent(s -> System.out.println(list.indexOf(s)));
Java 8 确实包含对此类操作的优化。
顺便说一句,如果您的列表非常大,您可能会发现使用 parallelStream() 而不是 stream() 可以提高速度 - 此 Java 8 代码可能与您的代码执行相同数量的操作,但它可以在多个没有传统 for 循环的 CPU 内核。
或者,如果您确实需要一种立即访问所需元素的方法,并且您正在寻找的标准始终相同(即您总是只需要包含“E”的元素) ,您可以在其他数据结构(如地图)中跟踪数据。例如。每次将项目添加到包含所需条件的列表时,您也会将其添加到地图中。比如:
Map<String, List<String>> mapOfValuesICareAbout = new HashMap<>();
String newValue = "GFE";
if (newValue.contains("E")) {
mapOfValuesICareAbout.get("E").add(newValue);
}
list.add(newValue);