【使用forEach()结合Lambda表达式遍历集合】
public class ForEachDemo { public static void main(String[] args) { Collection<String> list=new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Tomato"); //调用forEach()方法来遍历集合 list.forEach(obj->System.out.println(obj)); } }
【关于forEach(Consumer action)方法】
Java8为Iterable接口新增了一个forEach(Consumer action)默认方法,该方法的参数类型Consumer是一个函数式接口,而Iterable接口是Collection的父接口,因此Collection可以直接调用该方法。
当程序调用Iterable的forEach(Consumer action)方法遍历集合元素时,程序会依次将集合元素传给Consumer的accept(T t)方法(该接口中唯一的抽象方法),Consumer是一个函数式接口,所以可以使用Lambda表达式来遍历集合元素。
【Java8新增的Predicate操作集合】
Java8为Collection集合新增了一个removeIf(Predicate filter)方法,该方法会删除符合filter条件的所有元素。
该方法需要一个Predicate对象作为参数,Predicate也是函数式接口,因此可以使用Lambda表达式作为参数。
package com.Hggin.ForEach; import java.util.ArrayList; import java.util.Collection; public class PredicateDemo { public static void main(String[] args) { Collection<String> books=new ArrayList<>(); books.add("《Java编程思想》"); books.add("《Java并发编程》"); books.add("《Java多线程实战》"); books.add("《Spring实战》"); books.add("《Spring技术内幕》"); books.add("《大话数据结构》"); books.add("《大话设计模式》"); books.add("《设计模式之禅》"); /** * 使用Lambda表达式(目标类型是Predicate)过滤集合 * 移除所有带"Java"字符串的集合元素 */ books.removeIf(book->((String)book).contains("Java")); for(String b:books){ System.out.println("-----"+b); } /** * 使用Lambda表达式(目标类型是Predicate)过滤集合 * 移除所有字符串以"《大话"开头的集合元素 */ books.removeIf(book->((String)book).startsWith("《大话")); for(String b:books){ System.out.println("====="+b); } } }
【运行结果】
【分析】
上面调用了Collection集合的removeIf()方法批量删除集合中符合条件的元素,程序传入一个Lambda表达式作为过滤条件:所有满足条件的元素都会被删除。
【Predicate的test()方法的过滤统计作用】
public static void main(String[] args) { Collection<String> books=new ArrayList<>(); books.add("《Java编程思想》"); books.add("《Java并发编程》"); books.add("《Java多线程实战》"); books.add("《Spring实战》"); books.add("《Spring技术内幕》"); books.add("《大话数据结构》"); books.add("《大话设计模式》"); books.add("《设计模式之禅》"); books.add("《我是一个长度很长长长长长长长长长长长长长长长长长长的书名》"); books.add("《我也是一个长度很长长长长长长长长长长长长长长长长长长的书名》"); //统计含有"Spring"的子串的书名 System.out.println(callAll(books,book->((String)book).contains("Spring"))); //统计含有"Java"的子串的书名 System.out.println(callAll(books,book->((String)book).contains("Java"))); //统计 System.out.println(callAll(books,book->((String)book).length()>15)); } /** * 统计books集合中满足某个条件的集合元素的数量 * 使用Predicate判断每个集合元素是否满足特定的条件 * 该条件是通过Predicate参数动态传入 */ public static int callAll(Collection books,Predicate p){ int total=0; for(Object obj:books){ if(p.test(obj)){ //只会统计满足条件的对象 total++; } } return total; }
【运行结果】
【分析】
Java8在java.util.function包下预定以的典型接口之一xxxPredicate接口,通常包含一个test()抽象方法,该方法常用于对参数进行某种判断(test()方法的判断逻辑由Lambda表达式的方式实现),然后返回一个boolean值。该Predicate函数式接口常用语判断参数是否满足特定条件,常用于数据的筛选。