如何在Java Stream中匹配元素并打印,无匹配时输出默认提示?
用Stream实现带终止逻辑的车辆查找方法
我刚上手Streams和Lambda,想用它们替代传统的for循环。之前的findVehicle方法通过for循环查找匹配车牌(rego)的车辆,找到目标车辆后就打印信息并直接返回;如果遍历完都没找到,就输出提示语句。现在用Stream改写后,虽然能正常匹配并打印车辆信息,但没法做到找到就终止流处理,也不知道怎么在无匹配时输出错误提示。
原for循环实现代码
public void findVehicle(){ System.out.println("Input a vehicle rego: "); in = new Scanner(System.in); String rego = in.nextLine(); for (int i=0; i<vehicles.size();i++){ if (vehicles.get(i).getRego().equals(rego)){ System.out.println(vehicles.get(i).toString()); return; } } System.out.println("The vehicle does not exist."); }
当前Stream实现代码
public void findVehicle(){ System.out.println("Input a vehicle rego: "); in = new Scanner(System.in); String rego = in.nextLine(); vehicles.stream() .filter(vehicle -> vehicle.getRego().equals(rego.toUpperCase())) .forEach(System.out::println); }
解决方案
使用Stream的findFirst()方法实现短路查找,它会返回一个Optional对象,代表流中第一个匹配的元素(若存在)。配合ifPresentOrElse()方法,可以同时处理找到和未找到的场景,完全复刻原for循环的逻辑:
public void findVehicle(){ System.out.println("Input a vehicle rego: "); in = new Scanner(System.in); String rego = in.nextLine(); vehicles.stream() .filter(vehicle -> vehicle.getRego().equals(rego.toUpperCase())) .findFirst() // 找到第一个匹配项就立即终止流遍历 .ifPresentOrElse( System.out::println, // 找到车辆时打印信息 () -> System.out.println("The vehicle does not exist.") // 未找到时输出提示 ); }
逻辑说明
findFirst()是短路操作,一旦找到符合条件的元素就停止后续遍历,和原for循环中找到就return的逻辑一致,避免不必要的性能消耗。ifPresentOrElse()方法直接提供了双分支处理:当Optional有值(找到车辆)时执行第一个参数的逻辑,无值(未找到)时执行第二个参数的逻辑,无需额外的分支判断。
内容的提问来源于stack exchange,提问作者skittlefiz
相关产品推荐
相关产品推荐

