JDK8-1-Lambda表达式(2)-方法传递(行为参数化)

news2024/10/6 14:37:15

JDK8-1-Lambda表达式(2)-方法传递(行为参数化)

Java 8 允许程序将方法作为参数传递,先看一个例子:

苹果实体类:

public class Apple {
    //颜色
    private String color;
    //重量,单位克,150克到400克
    private double weight;

    public Apple(String color, double weight) {
        this.color = color;
        this.weight = weight;
    }
	//get set 方法省略。。。
}

以下,filterGreenApples ,filterHeavyApples 方法分别表示过滤出不同类型的苹果

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class AppleFilterTest {

    private static final List<Apple> apples = Arrays.asList(
            new Apple("red", 400), new Apple("green", 300),
            new Apple("yellow", 100), new Apple("green", 200)
    );

    /**
     * 过滤出绿色的苹果
     * @param inventory
     * @return
     */
    public static List<Apple> filterGreenApples(List<Apple> inventory) {
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if ("green".equals(apple.getColor())) {
                result.add(apple);
            }
        }
        return result;
    }

    /**
     * 过滤出重苹果
     * @param inventory
     * @return
     */
    public static List<Apple> filterHeavyApples(List<Apple> inventory) {
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (apple.getWeight() > 150) {
                result.add(apple);
            }
        }
        return result;
    }

    public static void main(String[] args) {
        List<Apple> greenApples = filterGreenApples(apples);
        System.out.println(greenApples);

        List<Apple> heavyApples = filterHeavyApples(apples);
        System.out.println(heavyApples);
    }

}

从代码中可以看出,filterGreenApples 与 filterHeavyApples 方法代码几乎一模一样,仅仅只有 if 条件中的代码有区别,既然这样为什么不可以将筛选的代码抽出,过滤的部分作为公共逻辑呢
改造的部分为:

"green".equals(apple.getColor())
apple.getWeight() > 150

这两个条件都与 Apple apple 这个对象关联,可以将是否满足条件封装成一个接口,Apple apple 作为参数传入,接口定义如下:
为了更加通用,所以定义成泛型,不过实际工作中不用自己定义,因为JDK8已经有了,具体路径为:
java.util.function.Predicate

public interface Predicate<T> {
    boolean test(T t);
}

filterGreenApples,filterHeavyApples 可以统一用一个方法 filterApples 代替,只要将条件参数传入即可,filterApples 方法如下,其中 predicate 为条件,if 条件中只需调用 predicate test 方法,成功表示满足条件:

public static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> predicate) {
    List<Apple> result = new ArrayList<>();
    for (Apple apple : inventory) {
        if (predicate.test(apple)) {
            result.add(apple);
        }
    }
    return result;
}

调用方式:

List<Apple> greenApples = filterApples(apples, apple -> "green".equals(apple.getColor()));
List<Apple> heavyApples = filterApples(apples, apple -> apple.getWeight() > 150);

实际工作使用

顺序处理(串行流)

在实际工作中我们根本不用定义 filterApples 这个方法,因为JDK已经提供 filter 方法,实际使用如下:
这里使用了JDK8的新特性 Stream API,Stream 支持顺序或并行处理,下例为顺序处理

List<Apple> greenApples = apples.stream()
                .filter(apple -> "green".equals(apple.getColor()))
                .collect(Collectors.toList());

List<Apple> heavyApples = apples.stream()
      			.filter(apple -> apple.getWeight() > 150)
      			.collect(Collectors.toList());

filter 方法接收 java.util.function.Predicate 类型

Stream<T> filter(Predicate<? super T> predicate);

并行处理(并行流)

Java 8 parallelStream API 允许程序对数据操作做并行处理,即可以让CPU 某个内核处理数据列表的前一段,另外的内核处理数据列表的后一段,如下图所示:

图片来源:《Java 8 实战》

parallelStream API 具体使用方法如下:

List<Apple> greenApples2 = apples.parallelStream()
                .filter(apple -> "green".equals(apple.getColor())).collect(Collectors.toList());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Golang Leetcode】总目录(Day1~100)

Leetcode Golang Day1~10 Golang每日一练(leetDay0001) 1. 两数之和 Two Sum 2. 两数相加 Add Two Numbers 3. 无重复字符的最长子串 Longest-substring-without-repeating-characters Golang每日一练(leetDay0002) 4. 寻找两个正序数组的中位数 Median of two sorted arra…

【算法系列之链表I】leetcode206.反转链表

203.移除链表元素 力扣题目链接 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]解题思路 核心思路就是…

Hive数据类型和文件格式

文章目录 Hive数据类型和文件格式1 基本数据类型2. 集合数据类型2.1 Struct举例2.2 Array举例2.3 Map举例 3 数据类型转换3.1 隐式转换3.2 显示转换 4 文本文件数据编码 Hive数据类型和文件格式 Hive支持关系数据库中的大多数基本数据类型&#xff0c;同时也支持3种新的集合数…

KDZD绝缘油介质损耗电阻率测试仪参数

一、概述 测试仪依据GB/T5654-2007《液体绝缘材料相对电容率、介质损耗因数和直流电阻率的测量》设计制造。用于绝缘油等液体绝缘介质的介质损耗因数和直流电阻率的测量。 一体化结构。内部集成了介损油杯、温控仪、温度传感器、介损测试电桥、交流试验电源、标准电容器、高阻计…

无线无源中继采发仪在工程监测中的应用

无线无源中继采发仪在工程监测中的应用 随着科技的不断发展&#xff0c;无线传感技术在工程监测中的应用越来越广泛。其中&#xff0c;无线无源中继采发仪是一种新型的数据采集设备&#xff0c;能够将传感器数据通过无线信号传输到数据中心。本文旨在探讨无线无源中继采发仪在…

Scrum敏捷项目管理

在了解敏捷项目管理之前&#xff0c;我们先看下敏捷和传统项目管理有什么区别。 传统项目管理&#xff1a;阶段式项目管理模式。 制定详细的计划和步骤&#xff0c;按计划执行&#xff0c;直到所有的计划执行全部结束。咖 敏捷项目管理模式&#xff0c;从愿景和高价值的目标出…

基于摄影测量的三维重建【终极指南】

我们生活的时代非常令人兴奋&#xff0c;如果你对 3D 东西感兴趣&#xff0c;更是如此。 我们有能力使用任何相机&#xff0c;从感兴趣的物体中捕捉一些图像数据&#xff0c;并在眨眼间将它们变成 3D 资产&#xff01; 这种通过简单的数据采集阶段进行的 3D 重建过程是许多行业…

k8s service与ingress

1.前言 service只能作用与网络模型中的四层&#xff0c;ingress可以作用于网络模型中的七层&#xff0c;Service是一种抽象&#xff0c;定义了一个逻辑上的一组Pod以及访问它们的策略。Service为Pod提供了一个稳定的IP地址和DNS名称&#xff0c;并通过标签选择器来定义需要暴露…

SpringBoot_Vue3 《Hello World》项目入门教程

1. 前言 前后端分离模式&#xff0c;可以让后端和前端开发人员致力于自己擅长的领域&#xff0c;且可以让前端和后端业务逻辑高度解耦合。本文从一个简单的案例入手&#xff0c;讲解使用 spring boot和vue3如何实现前后端的分离。 前后端分离有2 种模式&#xff1a; 逻辑分离…

华为OD机试真题 JavaScript 实现【在字符串中找出连续最长的数字串】【2023 B卷 100分】,附详细解题思路

一、题目描述 输入一个字符串&#xff0c;返回其最长的数字子串&#xff0c;以及其长度。 若有多个最长的数字子串&#xff0c;则将它们全部输出&#xff08;按原字符串的相对位置&#xff09;。 本题含有多组样例输入。 数据范围&#xff1a; 字符串长度 1≤n≤200 &…

【LeetCode】240. 搜索二维矩阵 II

240. 搜索二维矩阵 II&#xff08;中等&#xff09; 这道题和 74. 搜索二维矩阵 基本一致&#xff0c;可以放在一起做。 方法一&#xff1a;变形的二叉搜索树 思路 这种做法和 74. 搜索二维矩阵完全一致。 我们可以将二维矩阵抽象成「以右上角为根的 BST」&#xff1a; 那…

基于python五子棋的设计与实现(论文+源码)_kaic

目 录 摘 要 绪 论 一、游戏的需求分析 &#xff08;一&#xff09;游戏设计目标 &#xff08;二&#xff09;游戏的功能需求 1.可视化模块 2.玩家操作模块 3.胜负判定模块 &#xff08;三&#xff09;游戏的性能需求 &#xff08;四&#xff09;游戏其它需求 二、五子棋游戏…

JDK1.8环境安装及配置

JDK1.8环境安装及配置 一、下载JDK1.8二、安装三、环境变量配置四、验证 一、下载JDK1.8 本教程使用的是8u202版本&#xff0c;若需要其他版本可点击下方链接跳转下载。 Oracle下载&#xff0c;点击跳转选择版本 如下图所示&#xff0c;选择自己需要的版本下载 点击8u202版本…

斯坦福《Transformers集结》;大语言模型“书生・浦语“发布

&#x1f989; AI新闻 &#x1f680; 上海人工智能实验室发布1040亿参数大语言模型"书生・浦语"&#xff0c;在多项考试中超越ChatGPT 摘要&#xff1a;上海人工智能实验室近日发布了一个千亿级参数大语言模型——“书生・浦语”。该模型在多领域测试中表现优秀&am…

linuxOPS基础_linux计划任务

什么是计划任务 作用&#xff1a;操作系统不可能24 小时都有人在操作&#xff0c;有些时候想在指定的时间点去执行任务&#xff08;例如&#xff1a;每天凌晨 2 点去重新启动httpd>阿帕奇&#xff09;&#xff0c;此时不可能真有人每天夜里 2 点去执行命令&#xff0c;这就…

大手笔!微软一口气在 GitHub 开源了 5 个技术教程。。

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 此前&#xff0c;我曾介绍过微软在 GitHub 开源的一系列面向初学者的技术教程。 现如今&#xff0c;两年时间过去了&#xff0c;这些教程都更新了不少内容&#xff0c;另外还新增了人工智能…

百度离线资源治理

作者 | 百度MEG离线优化团队 导读 近些年移动互联网的高速发展驱动了数据爆发式的增长&#xff0c;各大公司之间都在通过竞争获得更大的增长空间&#xff0c;大数据计算的效果直接影响到公司的发展&#xff0c;而这背后其实依赖庞大的算力及数据作为支撑&#xff0c;因此在满足…

如何熟练的运用数学模型在水环境影响评价、防洪评价与排污口论证项目中的方法

数学模型在水环境评价、防洪评价和排污口论证等领域中的重要作用&#xff0c;随着人类活动的不断增加和环境问题的日益突出&#xff0c;对水资源和水环境的保护与管理变得至关重要。为了更好地理解和应对这些挑战&#xff0c;数学模型成为一种强大的工具&#xff0c;能够提供量…

使用HHDESK完成网站穿透

在工作和学习中&#xff0c;有很多内网网站&#xff0c;不能通过公网进行访问&#xff0c;需要特定的IP&#xff1b;而IP费用极高&#xff0c;比如按IP收费&#xff0c;费用根据流量带宽来&#xff0c;——这着实是一笔很大的开支。 而通过HHDESK&#xff0c;使用hhtp协议代理…

软考A计划-系统架构师-官方考试指定教程-(5/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…