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

时间: 2024-12-23 13:43:10

09_Lambda表达式的遍历的相关文章

C# 表达式树遍历(二)

一.前言 上一篇我们对表达式树有了初步的认识,这里我们将对表达式树进行遍历,只有弄清楚了他的运行原理,我们才可以对他进行定制化修改. 表达式系列目录 C# 表达式树讲解(一) C# 表达式树分页扩展(三) 二.表达式树的遍历 要查看表达式树的遍历,肯定不能直接用.Net Framework封装的方法,因为.Net Framework框架是闭源的,除了看中间语言(IL)去查看.我们就用ExpressionVisitor类查看一下他的运行原理,看了下ExpressionVisitor类,里面都是对各

Lambda表达式遍历集合

1.Collection Java 8 为Iterable接口新增了一个forEach(Consumer action)默认方法,该方法所需参数的类型是一个函数式接口,而Iterable接口是Collection接口的父接口,因此Collection集合也可以直接调用该方法. 当程序调用Iterable的forEach(Consumer action)遍历集合元素时,程序会依次将集合元素传给Consumer的accept(T t)方法(该接口中唯一的抽象方法).正因为Consumer是函数式接口

Java8 Lambda表达式介绍

欢迎进入我的博客:blog.scarlettbai.com查看更多文章 Lambda表达式是Java8里的一个重要特性,发布这么久了,最近在学swift语言时发现了其中的闭包的概念其实跟Lambda表达式极其相似,于是今天整理一下Java8中的Lambda表达式,做个介绍. Lambda表达式其实就是提供Java编程中对于函数式编程的支持,在我们习惯了一切皆对象时,刚接触Lambda可能读起来比较费劲,但是习惯之后,其确实有助于代码的简洁,且在Python.swift等中都有类似于Lambda这

数据结构栈之计算后缀表达式

对于一个给定的后缀表达式,(如果它是合法的) 注意:次算法是基于基本操作符是2元操作符且操作数为一位正整数! 其求值的基本思想是:对于给定的表达式进行遍历,假设遇到的是操作数就将其压入栈:假设遇到的是操作符,将栈顶的两个元素弹出,假设栈顶两个元素依次为a,b(a在上b在下),将次操作符应用于这两个栈顶元素,比方b-a(注意b在左a在右)然后将计算结果压入栈(用来充当下一个操作符的操作数): 最后输出栈顶元素即为结果(事实上假设表达式合法终于栈里面一定会仅仅有一个元素) #include <std

【算法】表达式求值--逆波兰算法介绍

逆波兰算法介绍 假定给定一个只 包含 加.减.乘.除,和括号的算术表达式,你怎么编写程序计算出其结果. 问题是:在表达式中,括号,以及括号的多层嵌套 的使用,运算符的优先级不同等因素,使得一个算术表达式在计算时,运算顺序往往因表达式的内容而定,不具规律性. 这样很难编写出统一的计算指令.使用逆波兰算法可以轻松解决.他的核心思想是将普通的中缀表达式转换为后缀表达式. 转换为后缀表达式的好处是:1.去除原来表达式中的括号,因为括号只指示运算顺序,不是完成计算必须的元素.2.使得运算顺序有规律可寻,计

怎样线程安全地遍历List:Vector、CopyOnWriteArrayList

遍历List的多种方式 在讲怎样线程安全地遍历List之前,先看看通常我们遍历一个List会採用哪些方式. 方式一: for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } 方式二: Iterator iterator = list.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } 方式三: for

初探Java8lambda表达式

要说现在什么火, 估计函数式编程算一个吧,看看人家javascript写起来多爽,java呢?一切皆对象.好像离着函数式编程挺远的,不过在java8中我们终于迎来了类似函数式编程-Java风格的lambda表达式,在用lambda重构你的代码后,啥感觉? 倍爽! 这篇博客我们就来小探一下java8的lambda表达式,领略一下lambda表达式的风骚! lambda表达式语法 lambda的语句可以用以下伪代码表示,很简单,不过还有很多更简单的表达方式, (Type ...argument) -

java8 增强的Iterator遍历集合元素

Iterator接口也是Java集合框架的成员,与Collection和Map两个系列的集合不一样的是Collection和Map系列主要用于充当容器的作用,而Iterator正如其名字一样是主要用于迭代访问Collection集合中的元素,Iterator对象也被称为迭代器. Iterator接口里面定义了下面4个方法: >boolean hasNext():如果被迭代遍历的集合还没有被遍历完,返回True >Object next():返回集合里面的下一个元素 >remove():删

yield表达式形式

首先了解 1.iterator iterator叫做迭代器,用来遍历可以序列化的数据,比如一个list,set 等,当然如果对象想要能够使用迭代器来遍历,只要在该对象的类中添加__iter__()方法,该方法返回一个迭代器对象,迭代器对象中需要实现next()方法 for example: >>> class sequenceClass(object):   ...     def __init__(self, *args):   ...             self._data =