📜  从列表中移除满足Java中给定谓词元素

📅  最后修改于: 2020-03-27 15:23:18             🧑  作者: Mango

下面是有效地从满足谓词条件的列表中删除元素的方法:

p   ==>谓词,指定条件
l ==>列表,从中删除元素
  1. 使用迭代器
    下面的程序演示了使用谓词从列表中删除空元素
    // Java展示移除null
    // 使用迭代器和谓词元素
    import java.util.function.Predicate;
    import java.util.*;
    class GFG {
        // 移除所有的null元素
        public static  List
        removeNullUsingIterator(List l, Predicate p)
        {
            // 创建一个迭代器
            Iterator itr = l.iterator();
            // 找到并移除null
            while (itr.hasNext()) {
                // 获取下一个元素
                T t = itr.next();
                // 检查谓词Predicate条件
                if (p.test(t)) {
                    // 如果条件满足,则移除
                    itr.remove();
                }
            }
            // 返回null
            return l;
        }
        public static void main(String[] args)
        {
            // 创建l,包含null
            List l = new ArrayList<>(
                   Arrays.asList("芒果",
                                 null,
                                 "for芒果",
                                 null,
                                 "A computer portal"));
            // 打印list
            System.out.println("List包含了null: " + l);
            // 创建谓词条件
            Predicate isNull = item -> Objects.nonNull(item);
            // 移除null
            l = removeNullUsingIterator(l, isNull);
            // 打印list
            System.out.println("List在null被移除之后: " + l);
        }
    }

    输出:

    List包含了null: [芒果, null, for芒果, null, A computer portal]
    List在null被移除之后: [芒果, for芒果, A computer portal]
    
  2. 使用List.removeAll()

    在此方法中,包含要删除元素的集合用于从原始l中删除那些元素。它要求使用谓词条件创建具有所需元素的集合。完成此操作后,将在原始l中搜索此集合,并删除其所有实例。

    // Java展示使用List.removeAll()从list中删除所有的10
    import java.util.function.Predicate;
    import java.util.*;
    class GFG {
        // 使用谓词Predicate删除元素
        public static  List
        removeElements(List l, Predicate p)
        {
            // 创建collection,使用Predicate
            Collection collection = new ArrayList<>();
            for (T t : l) {
                if (p.test(t)) {
                    collection.add(t);
                }
            }
            // 打印list
            System.out.println("要被删除的Collection: " + collection);
            // 使用List.removeAll()删除10 
    
            l.removeAll(collection);
            // 返回list
            return l;
        }
        public static void main(String[] args)
        {
            // 创建list,包含null
            List l = new ArrayList<>(
                Arrays.asList("1", "10", "15", "10", "12", "5", "10", "20"));
            // 打印list
            System.out.println("原始list: " + l);
            // 创建一个谓词条件Predicate,检查10
            Predicate is10 = i -> (i == "10");
            // 移除谓词Predicate
            l = removeElements(l, is10);
            // 打印list
            System.out.println("更新后的List: " + l);
        }
    }

    输出:

    原始list: [1, 10, 15, 10, 12, 5, 10, 20]
    要被删除的Collection: [10, 10, 10]
    更新后的List: [1, 15, 12, 5, 20]

     

  3. 使用Lambdas(Java 8)

    Stream.filter()方法可以在Java 8中使用,该方法返回由与给定谓词条件匹配的元素组成的流。

    // Java从一个list当中移除null
    
    import java.util.function.Predicate;
    import java.util.stream.Collectors;
    import java.util.*;
    class GFG {
        // 使用谓词Predicate移除元素
        public static  List
        removeElements(List l, Predicate p)
        {
            // 使用Java Stream移除nulls
            // 在lambda表达式中使用谓词Predicate条件
            l = l.stream()
                       .filter(p)
                       .collect(Collectors.toList());
            // 返回list
            return l;
        }
        public static void main(String[] args)
        {
            // 创建一个list,包含null
            List l = new ArrayList<>(
                Arrays.asList("芒果",
                              null,
                              "for芒果",
                              null,
                              "A computer portal"));
            // 打印list
            System.out.println("list包含null: " + l);
            // 创建一个谓词条件,检查null
            Predicate isNull = i -> (i == null);
            // 移除谓词Predicate
            l = removeElements(l, isNull);
            // 打印list
            System.out.println("在null被移除List之后: " + l);
        }
    }

    输出:

    list包含null: [芒果, null, for芒果, null, A computer portal]
    在null被移除List之后: [芒果, for芒果, A computer portal]
    

     

  4. 使用removeIf()

    顾名思义,这是删除满足给定谓词的所有元素的直接方法。

    // Java8,从list当中移除元素
    import java.util.function.Predicate;
    import java.util.*;
    class GFG {
        // 使用谓词移除元素
        public static  List
        removeElements(List l, Predicate p)
        {
            // 使用removeIf() 和谓词,移除元素 
            l.removeIf(x -> p.test(x));
            // 返回list
            return l;
        }
        public static void main(String[] args)
        {
            //  创建list,包含null
            List l = new ArrayList<>(
                Arrays.asList("芒果",
                              null,
                              "for芒果",
                              null,
                              "A computer portal"));
            // 打印list
            System.out.println("list包含null: " + l);
            // Creating a Predicate condition checking for null
            Predicate isNull = i -> (i == null);
            // 使用Predicate谓词移除元素
            l = removeElements(l, isNull);
            // 打印list
            System.out.println("list在null被移除之后: " + l);
        }
    }

    输出:

    list包含null: [芒果, null, for芒果, null, A computer portal]
    list在null被移除之后: [芒果, for芒果, A computer portal]