首页 > 代码库 > 09_Lambda表达式的遍历

09_Lambda表达式的遍历

【使用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函数式接口常用语判断参数是否满足特定条件,常用于数据的筛选。

09_Lambda表达式的遍历