码迷,mamicode.com
首页 > 其他好文 > 详细

09_Lambda表达式的遍历

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

标签:style   java编程   spring   ++   pre   stat   返回   java编程思想   out   

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

标签:style   java编程   spring   ++   pre   stat   返回   java编程思想   out   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!