首页 > 其他 > 详细

09_Lambda表达式的遍历

时间:2016-12-01 21:18:37      阅读:244      评论:0      收藏:0      [点我收藏+]

【使用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表达式的遍历

原文:http://www.cnblogs.com/HigginCui/p/6122642.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!