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

2021年3月17日14:53:51 发表评论 778 次浏览

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

p  ==> Predicate, specifying the condition
l  ==> List, from which element to be removed

使用迭代器

下面的程序演示了使用谓词从列表中删除空元素

// Java Program to remove nulls
// from a List using iterator and Predicate
import java.util.function.Predicate;
import java.util.*;
  
class GFG {
  
     // Generic function to remove Null Using Iterator
     public static <T> List<T>
     removeNullUsingIterator(List<T> l, Predicate<T> p)
     {
  
         // Create an iterator from the l
         Iterator<T> itr = l.iterator();
  
         // Find and remove all null
         while (itr.hasNext()) {
  
             // Fetching the next element
             T t = itr.next();
  
             // Checking for Predicate condition
             if (p.test(t)) {
  
                 // If the condition matches, // remove that element
                 itr.remove();
             }
         }
  
         // Return the null
         return l;
     }
  
     public static void main(String[] args)
     {
  
         // Create the l with null values
         List<String> l = new ArrayList<>(
                Arrays.asList( "Geeks" , null , "forGeeks" , null , "A computer portal" ));
  
         // Print the list
         System.out.println( "List with null values: " + l);
  
         // Creating a Predicate condition checking for null
         Predicate<String> isNull = item -> Objects.nonNull(item);
  
         // Removing nulls using iterator and Predicate
         l = removeNullUsingIterator(l, isNull);
  
         // Print the list
         System.out.println( "List with null values removed: " + l);
     }
}

输出如下:

List with null values: [Geeks, null, forGeeks, null, A computer portal]
List with null values removed: [Geeks, forGeeks, A computer portal]

使用List.removeAll()

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

// Java Program to remove 10
// from a List using List.removeAll() and Predicate
import java.util.function.Predicate;
import java.util.*;
  
class GFG {
  
     // Generic function to remove elements using Predicate
     public static <T> List<T>
     removeElements(List<T> l, Predicate<T> p)
     {
  
         // Create collection using Predicate
         Collection<T> collection = new ArrayList<>();
  
         for (T t : l) {
             if (p.test(t)) {
                 collection.add(t);
             }
         }
  
         // Print the list
         System.out.println( "Collection to be removed: " + collection);
  
         // Removing 10 using List.removeAll()
         // passing a collection
         l.removeAll(collection);
  
         // Return the list
         return l;
     }
  
     public static void main(String[] args)
     {
  
         // Create a list with null values
         List<String> l = new ArrayList<>(
             Arrays.asList( "1" , "10" , "15" , "10" , "12" , "5" , "10" , "20" ));
  
         // Print the list 
         System.out.println( "Original List: " + l);
  
         // Creating a Predicate condition checking for 10
         Predicate<String> is10 = i -> (i == "10" );
  
         // Removing using Predicate
         l = removeElements(l, is10);
  
         // Print the list
         System.out.println( "Updated List: " + l);
     }
}

输出如下:

Original List: [1, 10, 15, 10, 12, 5, 10, 20]
Collection to be removed: [10, 10, 10]
Updated List: [1, 15, 12, 5, 20]

使用Lambdas(Java 8)

可以在Java 8中使用Stream.filter()方法, 该方法返回由元素组成的流

匹配给定谓词条件。

// Java Program to remove nulls
// from a List using Java 8
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.*;
  
class GFG {
  
     // Generic function to remove elements using Predicate
     public static <T> List<T>
     removeElements(List<T> l, Predicate<T> p)
     {
  
         // Removing nulls using Java Stream
         // using Predicate condition in lambda expression
         l = l.stream()
                    .filter(p)
                    .collect(Collectors.toList());
  
         // Return the list 
         return l;
     }
  
     public static void main(String[] args)
     {
  
         // Create a list with null values
         List<String> l = new ArrayList<>(
             Arrays.asList( "Geeks" , null , "forGeeks" , null , "A computer portal" ));
  
         // Print the list 
         System.out.println( "List with null values: " + l);
  
         // Creating a Predicate condition checking for null
         Predicate<String> isNull = i -> (i == null );
  
         // Removing using Predicate
         l = removeElements(l, isNull);
  
         // Print the list 
         System.out.println( "List with null values removed: " + l);
     }
}

输出如下:

List with null values: [Geeks, null, forGeeks, null, A computer portal]
List with null values removed: [Geeks, forGeeks, A computer portal]

使用removeIf()

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

// Java Program to remove nulls
// from a List using Java 8
import java.util.function.Predicate;
import java.util.*;
  
class GFG {
  
     // Generic function to remove elements using Predicate
     public static <T> List<T>
     removeElements(List<T> l, Predicate<T> p)
     {
  
         // Removing nulls using Java Stream
         // using Predicate condition in removeIf()
         l.removeIf(x -> p.test(x));
  
         // Return the list 
         return l;
     }
  
     public static void main(String[] args)
     {
  
         // Create a list with null values
         List<String> l = new ArrayList<>(
             Arrays.asList( "Geeks" , null , "forGeeks" , null , "A computer portal" ));
  
         // Print the list
         System.out.println( "List with null values: " + l);
  
         // Creating a Predicate condition checking for null
         Predicate<String> isNull = i -> (i == null );
  
         // Removing using Predicate
         l = removeElements(l, isNull);
  
         // Print the list
         System.out.println( "List with null values removed: " + l);
     }
}

输出如下:

List with null values: [Geeks, null, forGeeks, null, A computer portal]
List with null values removed: [Geeks, forGeeks, A computer portal]

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: