【Java】练习:使用Predicate接口对String数组元素信息进行筛选的两种方式

本文介绍了如何使用Java的Predicate接口结合and方法,从包含姓名和性别的字符串数组中筛选出满足条件的女性且名字为四个字的元素,并将其存储到ArrayList或List中。

题目

  数组当中有多条“姓名+性别”的信息如下,请通过Predicate 接口的拼装将符合要求的字符串筛选到集合ArrayList(或List)中,需要同时满足两个条件:
  1.必须为女生;
  2.姓名为4个字。

String[] array = {"迪丽热巴,女", "古力娜扎,女", "马尔扎哈,男", "赵丽颖,女"};

  博主自行解答:

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

public class Demo01Test02 {
   
   
    public static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2) {
   
   
        //return pre1.test(s) && pre2.test(s);
        return pre1.and(pre2).test(s);//等价于return pre1.test(s) && pre2.test(s);
    }

    public static void main(String[] args) {
   
   
        String[] arr01 = 
<think>我们正在寻找一个Java工具方法,用于检查String数组是否包含特定值。这个问题和之前讨论的JPA更新方法没有直接关联,因此我们将专注于当前问题。在Java中,有几种方法可以检查数组是否包含特定值:1.使用循环遍历数组并逐个比较。2.使用Arrays类中的binarySearch方法(但要求数组已排序)。3.使用Arrays.asList()将数组换为列表,然后使用contains方法。4.使用Java8的StreamAPI。由于我们需要一个工具方法,我们可以提供一个静态方法,这样可以直接调用。下面提供几种实现方式方法1:使用循环(适用于所有情况,包括未排序数组方法2:使用Arrays.asList(简单,但注意:数组换为列表后的行为)方法3:使用StreamAPI(Java8及以上)注意:字符串比较时,我们通常需要考虑大小写敏感性。我们可以让方法支持一个可选参数来指定是否忽略大小写,或者默认使用大小写敏感的比较。但是,通常我们建议让工具方法具有灵活性。我们可以设计两个方法:一个使用默认的大小写敏感比较,另一个允许传入比较方式(例如,使用String的equalsIgnoreCase)。然而,为了简单,我们首先提供大小写敏感的比较,然后可以扩展。下面是一个使用Arrays.asList的实现(大小写敏感):但是注意:Arrays.asList返回的列表是基于原始数组的,所以效率较高。但是,contains方法使用的是String的equals方法,因此是大小写敏感的。示例方法:```javaimportjava.util.Arrays;publicclassArrayUtils{publicstaticbooleancontains(String[]array,Stringvalue){if(array==null){returnfalse;}returnArrays.asList(array).contains(value);}}```如果要忽略大小写,我们可以使用循环:```javapublicstaticbooleancontainsIgnoreCase(String[]array,Stringvalue){if(array==null||value==null){returnfalse;}for(Stringstr:array){if(value.equalsIgnoreCase(str)){returntrue;}}returnfalse;}```或者使用StreamAPI(Java8+):```javaimportjava.util.Arrays;publicstaticbooleancontainsIgnoreCase(String[]array,Stringvalue){if(array==null||value==null){returnfalse;}returnArrays.stream(array).anyMatch(value::equalsIgnoreCase);}```我们也可以提供一个通用的方法,允许传入比较方式(通过Predicate或Comparator),但为了简单,上述两种方法已足够。用户可以根据自己的需求选择。同时,我们可以将这两个方法放在一个工具类中。注意:由于数组可能包含null值,我们在忽略大小写的方法中做了null检查。在大小写敏感的方法中,Arrays.asList(array).contains(value)已经处理了null值(因为contains方法允许value为null,如果数组中有null元素,则返回true)。但是,如果value为null,且数组中有null元素,那么包含;如果数组没有null元素,则不包含。因此,我们可以修改大小写敏感的方法,使其更健壮:```javapublicstaticbooleancontains(String[]array,Stringvalue){if(array==null){returnfalse;}for(Stringstr:array){if(str==null){if(value==null){returntrue;}}else{if(str.equals(value)){returntrue;}}}returnfalse;}```或者继续使用Arrays.asList,因为它内部也是循环,并且已经处理了null的情况:测试:Arrays.asList(newString[]{null,"a"}).contains(null)->trueArrays.asList(newString[]{null,"a"}).contains("a")->true但是,如果value为null,那么Arrays.asList(array).contains(null)会返回数组是否包含null。所以,我们之前的方法已经可以工作。但是,当value为null时,使用Arrays.asList(array).contains(value)没有问题。但是,当数组为null时,我们需要提前返回,避免NPE。因此,我们之前的方法数组为null时返回false,这是合理的。总结:我们可以使用Arrays.asList的方式来实现大小写敏感的方法,因为它简洁且正确。而忽略大小写的方法需要自己遍历,因为String的equalsIgnoreCase在比较null时会抛出NullPointerException,所以我们在循环中要避免使用null调用方法,因此我们通过先检查数组中的元素是否为null来避免。实际上,在循环中,如果数组元素str为null,那么value.equalsIgnoreCase(str)会抛出NPE。因此,我们改进一下:在忽略大小写的方法中,先判断value是否为null(因为如果value为null,那么我们不能调用value.equalsIgnoreCase,而且null与任何非null字符串都不相等)。同时,数组元素为null时,只有value也为null才相等(忽略大小写?但是null没有大小写概念,所以我们可以认为:两个null相等;一个null和一个非null不等)。因此,修改忽略大小写的方法:```javapublicstaticbooleancontainsIgnoreCase(String[]array,Stringvalue){if(array==null){returnfalse;}for(Stringstr:array){if(str==null){if(value==null){returntrue;}}else{if(value==null){//此时数组元素非null,value为null,不相等}else{if(str.equalsIgnoreCase(value)){returntrue;}}}}returnfalse;}```或者更简洁的写法:```javapublicstaticbooleancontainsIgnoreCase(String[]array,Stringvalue){if(array==null){returnfalse;}for(Stringstr:array){if(str!=null&&str.equalsIgnoreCase(value)){returntrue;}elseif(str==null&&value==null){returntrue;}}returnfalse;}```但注意:这样写,当str为null而value不为null时,不会进入第一个if,但会进入elseif(因为str==null成立,但value不为null,所以elseif条件不满足)。所以可以写成:```javapublicstaticbooleancontainsIgnoreCase(String[]array,Stringvalue){if(array==null){returnfalse;}for(Stringstr:array){if(str==value){returntrue;//botharenullorsameobject}if(str!=null&&value!=null&&str.equalsIgnoreCase(value)){returntrue;}}returnfalse;}```但是,这个写法中,str==value在两者都是null时返回true,在同一个对象时也返回true。但是同一个对象的情况已经包含在后面的equalsIgnoreCase中(因为同一个对象equalsIgnoreCase必定返回true)。所以,可以省略str==value的判断吗?不可以,因为如果value是null,那么后面的str.equalsIgnoreCase会报空指针。所以我们需要先处理null。所以,我们重新调整:情况1:str和value都为null->相等情况2:str和value其中有一个为null->不等情况3:两者都不为null,用equalsIgnoreCase比较代码:```javapublicstaticbooleancontainsIgnoreCase(String[]array,Stringvalue){if(array==null){returnfalse;}for(Stringstr:array){if(str==null){if(value==null){returntrue;}}else{if(value!=null&&str.equalsIgnoreCase(value)){returntrue;}}}returnfalse;}```这样写逻辑清晰。或者使用三元逻辑:```javapublicstaticbooleancontainsIgnoreCase(String[]array,Stringvalue){if(array==null){returnfalse;}for(Stringstr:array){if((str==null&&value==null)||(str!=null&&value!=null&&str.equalsIgnoreCase(value))){returntrue;}}returnfalse;}```现在,我们提供一个工具类,包含两个方法:一个大小写敏感,一个忽略大小写。由于用户要求工具方法,我们将其放在一个工具类中:```javaimportjava.util.Arrays;publicclassStringArrayUtils{//大小写敏感publicstaticbooleancontains(String[]array,Stringvalue){if(array==null){returnfalse;}returnArrays.asList(array).contains(value);}//忽略大小写publicstaticbooleancontainsIgnoreCase(String[]array,Stringvalue){if(array==null){returnfalse;}for(Stringstr:array){if(str==null){if(value==null){returntrue;}}else{if(value!=null&&str.equalsIgnoreCase(value)){returntrue;}}}returnfalse;}}```另外,我们也可以使用ApacheCommonsLang库中的ArrayUtils.contains方法(它支持基本类型和对象数组),但需要引入依赖。如果项目允许使用第三方库,那么使用ArrayUtils会更方便。但是,如果不想引入第三方库,那么自己写一个工具方法也很简单。因此,我们提供两种选择。在回答中,我们将提供自己实现的工具方法,并提到如果有第三方库可用,可以使用ArrayUtils。最后,我们根据用户的问题,提供完整的工具类代码。注意:上面的contains方法对null值处理是安全的,因为Arrays.asList的contains方法允许value为null(它使用Objects.equals(o,e)这样的比较?实际上,Arrays.asList返回的是ArrayList(Arrays内部类),它的contains方法代码是:publicbooleancontains(Objecto){returnindexOf(o)>=0;}publicintindexOf(Objecto){if(o==null){for(inti=0;i<size;i++)if(elementData[i]==null)returni;}else{for(inti=0;i<size;i++)if(o.equals(elementData[i]))returni;}return-1;}所以是安全的。因此,我们可以放心使用。现在,组织答案:</think> ### Java工具方法:检查String数组是否包含特定值 在Java中检查String数组是否包含特定值,可以通过以下工具方法实现。这些方法考虑了**空指针安全**和**大小写敏感/不敏感**的需求,并提供了多种实现方案: --- #### 方法一:基础循环实现(兼容所有Java版本) ```java public class ArrayUtils { /** * 大小写敏感检查 * @param array 目标数组 * @param target 搜索值 * @return 是否包含 */ public static boolean contains(String[] array, String target) { if (array == null || target == null) return false; for (String element : array) { if (target.equals(element)) { return true; } } return false; } /** * 忽略大小写检查 * @param array 目标数组 * @param target 搜索值 * @return 是否包含 */ public static boolean containsIgnoreCase(String[] array, String target) { if (array == null || target == null) return false; for (String element : array) { if (target.equalsIgnoreCase(element)) { return true; } } return false; } } ``` #### 方法二:使用Arrays工具类(Java 5+) ```java import java.util.Arrays; public static boolean contains(String[] array, String target) { return array != null && Arrays.asList(array).contains(target); } ``` #### 方法三:Stream API实现(Java 8+) ```java import java.util.Arrays; public static boolean contains(String[] array, String target) { return array != null && Arrays.stream(array).anyMatch(target::equals); } public static boolean containsIgnoreCase(String[] array, String target) { return array != null && Arrays.stream(array).anyMatch(s -> s != null && s.equalsIgnoreCase(target)); } ``` --- ### 使用示例 ```java public class Main { public static void main(String[] args) { String[] fruits = {"Apple", "Banana", "Orange"}; // 大小写敏感检查 System.out.println(ArrayUtils.contains(fruits, "Apple")); // true System.out.println(ArrayUtils.contains(fruits, "apple")); // false // 忽略大小写检查 System.out.println(ArrayUtils.containsIgnoreCase(fruits, "apple")); // true } } ``` ### 关键特性对比 | **方法** | **空值安全** | **大小写控制** | **兼容性** | **性能** | |------------------------|--------------|----------------|--------------|----------------| | 基础循环 | ✅ | ✅(需手动) | Java 1.0+ | $O(n)$ | | Arrays.asList().contains| ✅ | 仅敏感 | Java 5+ | $O(n)$ | | Stream API | ✅ | ✅ | Java 8+ | $O(n)$(并行可优化) | --- ### 推荐方案 1. **通用场景** → 使用`Arrays.asList().contains()` ```java boolean found = Arrays.asList(array).contains(target); ``` 2. **需要忽略大小写** → 自定义循环或Stream API 3. **高性能需求** → 基础循环实现(避免Stream开销)[^1] 4. **频繁操作** → 换为`HashSet`($O(1)$查询): ```java Set<String> set = new HashSet<>(Arrays.asList(array)); boolean exists = set.contains(target); ``` > **提示**:如果数组可能包含`null`值,需额外验证: > ```java > if (target == null) { > return Arrays.asList(array).contains(null); > } > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值