java8新特性详解之lambda:行为参数化

行为参数化(lambda) 行为参数化:就是一个方法接收多个不同的行为参数,并在内部使用他们,完成不同的行为能力。行为参数化可以更好的适应不断变化的需求,减少实际开发工作量。 现在有一些需求,苹果农场的农名将苹果采摘下来放在农场的仓库,需要从中筛选出所有绿色的苹果。 Apple类 public class Apple { private int weight = 0; private... 阅读详情

行为参数化

文骚人不骚的小隐开始整理java8的新知识了。这次整理的是
java8新特性详解之lambda:行为参数化
字面意思就是把行为化为参数的过程

如何让行为参数化

来,咱们边吹边讲。今天漂亮红姐过来啦,对着我莞尔一笑说:“小隐啊,我最近想倒腾点手机,现在有一批货,帮我找一下里面的苹果手机。”美女的忙肯定要帮,而且这也就是举手之劳!

/**
* 筛选苹果手机
*/ 
public static List<Phone> screenApplePhone(List<Phone> list) throws Exception{
	if( list==null || list.size()==0 ){
        throw new Exception("参数不全");
    }
    List<Phone> resultList = new ArrayList<>();
    for (Phone phone:list) {
        if("apple".equals(phone.getBrand())){
            resultList.add(phone);
        }
    }
    return resultList;
}

齐活!像这种代码闭着眼睛都不能写错了。但是红姐虽然人美,事从来没这么容易过。这不过了不到4分钟,红姐给我说:“华为的也给我找一下我看看。”小事,有之前的代码,那还不是两个ctrl的事。秒完。

/**
* 筛选华为手机
*/ 
public static List<Phone> screenHuaWeiPhone(List<Phone> list) throws Exception{
	if( list==null || list.size()==0 ){
        throw new Exception("参数不全");
    }
    List<Phone> resultList = new ArrayList<>();
    for (Phone phone:list) {
        if("HUAWEI".equals(phone.getBrand())){
            resultList.add(phone);
        }
    }
    return resultList;
}

但是,我们知道这种做法是不可取的,因为红姐一会可能还要找中兴的、小米的、魅族的、甚至已经破产的手机厂商的手机也要找找看(天知道她会不会搞到这些手机)。如果这样的话我们慢慢就应付不了了,更加严重的是打破了DRY(Don’t Repeat Yourself,不要重复自己)的软件工程原则,在你要对这些代码进行优化的时候你也要对所有相似的进行修改,极其容易产生遗落!嘿嘿,小隐我灵机一动。

/**
* 筛选某品牌的手机
*/ 
public static List<Phone> screenPhone(List<Phone> list,String brand) throws Exception{
	if( list==null || list.size()==0 || StringUtils.isEmpty(brand)){
        throw new Exception("参数不全");
    }
    List<Phone> resultList = new ArrayList<>();
    for (Phone phone:list) {
        if(brand.equals(phone.getBrand())){
            resultList.add(phone);
        }
    }
    return resultList;
}

不过作为一个宅男,难得有美女请求帮忙,自然方方面面都要想到。可能红姐要筛选的不仅仅是品牌,还可能通过价格筛选,我们最好是提前帮她准备好方案。

    /**
     * 筛选某品牌或者低于某价格的手机
     */
    public static List<Phone> screenPhone(List<Phone> list,String brand,Integer price) throws Exception{
        if( list==null || list.size()==0 || StringUtils.isEmpty(brand)|| price==null){
            throw new Exception("参数不全");
        }
        List<Phone> resultList = new ArrayList<>();
        for (Phone phone:list) {
            if(brand.equals(phone.getBrand()) || price<(phone.getPrice())){
                resultList.add(phone);
            }
        }
        return resultList;
    }

但是这个解决方案实在是让人不敢恭维,因为随着筛选条件的增多,以及不同筛选条件的组合你的方法参数会越来越多,内容会越来越沉重。
这个时候很多人应该会想到策略设计模式,我们定义一族算法,然后把这些算法封装起来,在使用时根据不同情况使用不同算法。

   /**
     * 为筛选手机定义策略
     */
    private interface PhonePredicate{
        Boolean test(Phone phone);
    }
    private class BrandPhonePredicate implements PhonePredicate{
        @Override
        public Boolean test(Phone phone) {
            return "apple".equals(phone.getBrand());
        }
    }
    private class PricePhonePredicate implements PhonePredicate{
        @Override
        public Boolean test(Phone phone) {
            return 1000>phone.getPrice();
        }
    }
//    ......
    /**
     * 利用完策略模式后的筛选方法
     */
    public static List<Phone> screenPhone(List<Phone> list,PhonePredicate phonePredicate) throws Exception{
        if( list==null || list.size()==0 || phonePredicate == null){
            throw new Exception("参数不全");
        }
        List<Phone> resultList = new ArrayList<>();
        for (Phone phone:list) {
            if(phonePredicate.test(phone)){
                resultList.add(phone);
            }
        }
        return resultList;
    }

其实这个时候,我们的代码已经足够灵活了,每次有新的筛选需求的时候我们只要维护新的算法就能够满足需要了。不过我们可能也及其不情愿这样做,因为在使用的时候我们不得不去声明算法,尽管它可能只被实例化一次。对于这种情况java早就给出了解决办法,那就是匿名类。它允许我们随用随建。

//这里仅是方法调用部分
phones = screenPhone(list, new PhonePredicate() {
            @Override
            public Boolean test(Phone phone) {
                return "apple".equals(phone.getBrand())&&1000>phone.getPrice();
            }
        });

这样对付各种情况就很舒心了,不过代码实在是很笨重,而且可读性以比较差。并且其实我们真正使用的也只是里面的极少部分代码即作为筛选条件的代码。那么我们可不可以把这部分代码作为参数直接使用呢?答案是:不行。不过java8给我们提供了另外一种方式->lambda。写法如下:

phones = screenPhone(list,phone -> {return "apple".equals(phone.getBrand())&&1000>phone.getPrice();});

是不是爽的呀批 ^ w ^!
这种方式变相的让我们把行为作为参数传递到了方法中。不过这里要重点注意的是,我们看似传递的是行为,其实本质是对象。具体解释会在接下来的整理中。上面例子你甚至可以看做是匿名内部类的简化,但并不是语法糖。因为lambda的实现方式并不符合语法糖的定义。

最后你的筛选方法可以更改为一个更加通用的形式,让你可以筛选任何你想筛选的对象:

private interface Predicate<T>{
    Boolean test(T t);
}
public static <T> List<T> screenPhone(List<T> list,Predicate<T> predicate) throws Exception{
   if( list==null || list.size()==0 || predicate == null){
       throw new Exception("参数不全");
   }
   List<T> resultList = new ArrayList<>();
   for (T item:list) {
       if(predicate.test(item)){
           resultList.add(item);
       }
   }
   return resultList;
}

小隐小故事 ——为什么想要行为参数化

我思考了一下,为什么要行为参数化。这个确实也不是太好解释,因为就我个人感觉而言,我并不能解释的很完整或者说很准确,不过依然要记录下个人的感受,当以有了更新的理解也还是会回来重新编辑这里的内容的。
看官上座,容我喝口水开始单口相声。
话说现在这社会不仅压力大,而且节奏快,尤其是在北上广打拼的同学们,那简直就感觉每个人都在疯狂地做事。只有在深夜回到家中,在黑暗里,独自舔舐着自己的伤口。这个时候人们往往会想找个年轻人多的地方发泄一下蹦个迪神马的。
在这里插入图片描述
当然你还能想到“朋友”。这个社会其实有甚多小圈子,大家都有来往。现在交通又这么发展,其实去找朋友一趟也用不了多久。
呐你在杭州,你朋友在重庆,你买张火车票就去了。因为很多人都会从杭州到重庆,所以,坐火车这个行为咱们可以拿出来做个方法,然后给大家去使用,大家也都会去用。但是你最近认识了一个同城的妹子。
在这里插入图片描述

没有大家公认的方式去找这个朋友,而且新认识的妹子,极有可能你只会找一次就再也不会去了。原因你知道的。但是你现在还兴致勃勃的想去找她呢,你们约了今晚十点半,可是现在已经快九点了。但是你们都不慌,因为这次你不用再去走那些大家共用的步骤了。不用去订票,取票,进站,出站了。你只需要打个车,告诉司机你要去哪就行了,而且你还可以让司机路过一间店面,给朋友准备点小礼物。
而打车这种方式就不同于你坐火车那种了,必须在哪上,然后到哪,而且路都已经规划好了你只有上火车然后等着到站下车就行了。
这样看来,你打车这种就像是行为参数化。你可以肆意指挥司机路线,只要你满意,你让司机绕两圈都行。你只要是你想走的路你都可以指挥司机去走。你给司机的就是行为参数。而坐火车你就是那个对象参数,你上车,等着车到站就行(或者半路出现什么事故,抛出异常 = =)。
不过当有人多人都认识这位朋友的时候很多人去找她时出发地点一样并且路线一样的时候,这个方法还是最好提出来让大家直接调用。因为这样才能避免这个朋友换住址了,你们所有人都要把路线(也就是前面你传给司机的行为参数)改一遍。

骚磕就唠这么多,其实这只是行为参数化的冰山一角。行为参数化更多的是让代码更好的适应不断变化的需求,因为现在的甲方爸爸都是很厉害的。另外一个很重要的点就是配合在java8中同时出现的stream。行为参数化和stream在java8中是相辅相成又可以各自使用的东西。但是就目前而言他们的搭配是绝佳的。stream也将会在我整理完lamdba之后进行整理,相应的配合使用以及一些问题的解决方式也将会以栗子的方式展示。

配置cts performance最优范围 这里写自定义目录标题cts例如此案例中,我们多测几次,发现Measured frame rate 的平均值为average=(380+389+380+371)/4=380 cts by VinterYoung Expected achievable frame rates for OMX.MTK.VIDEO.DECODER.HEVC video/hevc 1280x720: [75.0, 262.0]. Measured frame rate: [380.5645006622224, 389.3983545 阅读详情

相关推荐

Qwen-Image LoRA训练实战:从数据准备到异常修复的全流程解析

本文详细解析了Qwen-Image LoRA训练的全流程,从数据准备到参数优化再到异常修复。通过实战案例展示了如何利用LoRA技术微调Qwen-Image模型,提升中文场景下的图像生成质量,特别针对手脚生成异常等问题提供了有效解决方案。文章还分享了中文提示词优化技巧和高级训练方法,帮助开发者高效训练出高质量的LoRA模型。

lemon的博客 965

使用Lambda作为参数和返回值

1.使用Lambda作为参数 java.lang.Runnable就是接口就是一个函数式接口,假设有一个startThread方法使用该接口作为参数,那么就可以使用Lambda进行传参,这种情况其实和Thread类的构造方法参数Runnable没有根本区别。 package com.wcy.demo3.LambdaTest; /* 例如java.lang.Runnable就是接口就是一个函数式接口, */ public class demo1Runnable { //定义一个方法star

温泉 3510

从零构建无线AM信号模拟系统:基于STM32与AD9959的国赛一等奖方案解析

本文详细解析了基于STM32F103RCT6与AD9959芯片构建无线AM信号模拟系统的国赛一等奖方案。文章从项目背景、核心芯片选型出发,深入剖析了系统架构、硬件电路设计及软件控制逻辑,重点分享了“直流偏置叠加法”实现AM调制、多径模拟以及高频电路调试的实战经验与避坑指南,为参加全国大学生电子设计大赛的选手提供了一套完整、可靠的复现路径。

weixin_29182481的博客 180

java lambda做参数_java中的Lambda参数(Lambda Parameter in java)

java中的Lambda参数(Lambda Parameter in java)我的任务是如何将lambda表达式作为函数中的参数? 我的意图是,当我执行sum方法时,方法accept中的参数被对象继续使用并使用(我是对的吗?),我的疑问是如何使这个对象继续使用lambda表达式value1 + value2的结果,然后再做一些其他的事情?像X.sum(1,2,resultOfSum->{s...

weixin_35316459的博客 3317

OCEAN 电路仿真

介绍利用 Cadence OCEAN 进行电路脚本仿真的方法

weixin_43249158的博客 4402

手把手教你用示波器实测LVDS/CML信号:从波形解读到故障排查(附实测图)

本文详细介绍了如何使用示波器实测LVDS和CML信号,从波形解读到故障排查的全过程。涵盖差分探头选择、示波器配置、标准波形特征解读、眼图分析技巧以及高速信号捕获要点,帮助硬件工程师快速诊断和解决信号完整性问题。附实测图和案例,提升高速数字电路设计效率。

weixin_27215337的博客 199

Java中的Lambda表达式

Java中的Lambda表达式 Lambda表达式可以理解为简洁地表达可传递的匿名函数的一种方式。 他没有名称,但是有参数列表、函数主体、返回类型,还可以抛出异常 **可传递:**Lambda表达式可以作为参数传递给方法或存储在变量中 语法 Lambda表达式语法格式如下 (参数1, 参数2 ... ) -> {主体代码} Lambda语法有几个特点: **类型声明可省略:**参数的类型可省略,编译器可自动识别 **参数圆括号可省略:**一个参数可以省略圆括号,无参或多个参数需要圆括号 **大括号

qq_37817194的博客 1081

Linux 之 supervisor安装和使用

运行Supervisor的后台服务,它用来启动和管理那些你需要Supervisor管理的子进程,响应客户端发来的请求,重启意外退出的子进程,将子进程的stdout和stderr写入日志,响应事件等。它是Supervisor最核心的部分。

chang995196962的博客 5545

java中使用Lambda表达式实现参数化方法

参数化方法(通常指的是泛型方法)是那些可以接受类型参数的方法,这些类型参数在方法被调用时才被指定。参数化方法通常是指泛型方法,它允许你在方法定义中使用类型参数,使得方法能够处理多种不同的数据类型。通过使用Lambda表达式和泛型方法,你可以创建更加灵活和可重用的代码,因为你可以根据需要传递不同的比较逻辑或函数行为来适应不同的场景。通过使用泛型方法和Lambda表达式,你可以编写更加灵活和可复用的代码,因为你可以根据需要传递不同的Lambda表达式来实现不同的功能。泛型方法是带有类型参数的方法。

不安分的猿人的专栏 1443

笔记——Oracle19c

Oracle阅读笔记

weixin_63819458的博客 1348

【QNX+Android虚拟化方案】00 - 系列文章链接汇总

【QNX+Android虚拟化方案】00 - 系列文章链接汇总

|~~~热爱生活、努力学习的小伙汁~~~| 1万+

java行为参数化_Java Lambda行为参数化

Java Lambda行为参数化我们可以将lambda表达式作为参数传递给方法。例子以下代码创建了一个名为Calculator的函数接口。在Calculator中有一个称为calculate的方法,它接受两个int参数并返回一个int值。在Main类中有一个引擎方法,它接受函数接口Calculator作为参数。它从计算器调用计算方法并输出结果。在主方法中,我们用不同的lambda表达式调用引擎方法...

weixin_35275671的博客 441

【LAMMPS学习】八、基础知识(2.1)2D模拟

此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。LAMMPS 源代码分发的examples目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各种模拟。

荷塘阅色 1249

这篇最全 Java 8 讲解,有没有之一先看后说

一、基础知识 1)为什么要学习 Java8 Java 8 所做的改变,在许多方面比Java 历史上任何一次改变都更加深远,这些改变会让你的编程更加容易 例子: 传统写法: List<Person> personList = Arrays.asList(new Person(21,50),new Person(22,55),new Person(23,60)); Collections.sort(personList, new Comparator<Person>() ..

m0_65462541的博客 372

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java8新特性-行为参数化与lambda表达式

Java8新特性,lambda表达式,行为参数化

weixin_44183721的博客 1187

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

第1讲:为什么需要Java 8?—— 从行为参数化到Lambda

Java 8通过函数式编程革新了行为参数化模式,核心价值在于简化代码并提升可扩展性。文章详细解析了从传统策略模式到Lambda表达式的演进过程:初始实现面临代码重复问题,策略模式通过接口抽象筛选条件,而匿名类虽简化实现但仍显冗余。Lambda表达式最终提供简洁语法,配合函数式接口(Predicate、Function等)实现类型安全的行为传递。典型应用案例演示了如何用Lambda重写苹果筛选逻辑,并展示泛型方法实现多类型集合处理,显著提升代码复用性。这种范式转变使开发者能更高效地编写可维护、可扩展的代码。

热爱技术、喜欢学习、乐于分享 675

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java 8 ——行为参数化

前言 《Java8实战》不得不说是一本好书,捧起来看起来就兴奋得不想放下,其中介绍的函数式编程实在是太令人兴奋了,不仅仅大大提高了代码的可读性,而且提高了代码的重用性,并且语法简单。 Java 8中新增的功能是自Java 1.0发布以来18年以来,发生变化最大的一次。我本身没有太大的体会,但新增的这些功能,每一个都让我兴奋,这里就书中的内容简单的介绍一下Java 8的这些新特性,我相信很快,你...

我没有三颗心脏的博客 1893

【Java8】Java8实战之行为参数化与Lambda

Java8实战之行为参数化与Lambda 前言 现在Java的迭代速度比以前快了很多,然而,本渣渣最近才开始学习Java8,相比于之前的版本,Java8中引入了许多新的特性,其中最主要的是Lambda、Stream、Optional&amp;amp;lt;T&amp;amp;gt;、新的时间日期API,接下来将分成几个小节,分别学习这些内容,并且将学习笔记整理出来,参考书籍为《Java8实战》。 本小节主要学习行为参数...

曾经沧海难为水,除却巫山不是云 1020

java8新特性之行为参数化

java8新特性之行为参数化为什么要有行为参数化?什么是行为参数化需求复杂变化让行为参数化多种行为,一个参数测试对付啰嗦解决啰嗦1(不太完美)解决啰嗦2(太完美)小结下一章 Lambda表达式 为什么要有行为参数化? 在软件工程中,一个众所周知的问题就是,不管你做什么,用户的需求肯定会变。。比方说,有个应用程序是帮助农民了解自己的库存的。这位农民可能想有一个查找库存中所有绿色苹果的功能。但到了第二天,他可能会告诉你:“其实我还想找出所有重量超过150克的苹果。”又过了两天,农民又跑回来补充道:“要是我可以找

shuai_ge_feng的博客 570

java8行为参数化/lambda实现示例

java8行为参数化/lambda实现示例//定义Applepublic class Apple { private String color; private int weight; private String type; public Apple(String color, String type, int weight) { this.color = color; this.type...

三月的博客 1711

Java8新特性之Lambda

为什么要Lambda Java8应该是目前最大的一次更新了,更新后我们迎来了很多新特性,其中便包括Lambda表达式,函数式编程的思想正式进入Java,让我们看一个经典案例。 例1 按照两个人的年龄排序的功能 采用匿名内部类已经算简介了,如果专门用一个类去实现Comparator再new出来就更烦了,过去的写法: // 已经创建好了三个Person实例 List<Person>...

songfei_dream的专栏 1939

行为参数化和Lambda表达式(Java8)

1 行为参数化 使用场景:应对频繁变更的需求(的一种软件开发模式) 使用好处:”一个方法,多个行为”,即写一个方法,可以接受不同的新行为作为参数,实现不同的功能。 举个例子:你要处理一个集合,可能会写出这样的业务方法: 对列表中每个元素都做“事件A” 处理完列表后做“事件B” 遇到错误时做“事件E” 行为参数化就是将上面所述的事件A、B、E等行为提升为...

此处省略三千字 1215

Java-8:五分钟学习行为参数化

1、概览 Java8的改进比历史上任何一次改变都比较深远。Java不断改进也是编程语言生态变化的使然——诸如大数据需要在多核上面运行,而Java此前是不支持这种操作的。 在Java8之前,如果想要利用多个计算机的内核,你要使用线程,并且要处理复杂的同步逻辑。但是在Java8中,你可以很容易地使用流让自己的代码在多个内核上面执行。 此外,它还借鉴了其他语言和开源库的内容,比如Scala、Guava等...

你好,开发者 804

Java 8(一):行为参数化

文章目录1、认识行为参数化2、示例推演行为参数化2.1、筛选绿苹果2.2、颜色作为参数筛选2.3、多个属性作为参数筛选2.4、行为参数化2.5、根据抽象条件筛选2.6、使用匿名类2.7、使用Lambda表达式2.8、List 类型抽象化3、行为参数化在 Java API中的应用实例3.1、用 Comparator 排序3.2、用 Runnable 执行代码块 1、认识行为参数化 通过相关书籍或网络...

码客 841

java8 - 行为参数化

s

进步新青年的博客 243

Java 8新特性:Lambda表达式

Java 8新特性:Lambda表达式 2014年3月发布的Java 8,有可能是Java版本更新中变化最大的一次。新的Java 8为开发者带来了许多重量级的新特性,包括Lambda表达式,流式数据处理,新的Optional类,新的日期和时间API等。这些新特性给Java开发者带来了福音,特别是Lambda表达式的支持,使程序设计更加简化。本篇文章将讨论行为参数化,Lambda表达式,函数式接口等特性。 行为参数化 在软件开发的过程中,开发人员可能会遇到频繁的需求变更,使他们不断地修改程序以应

Likes的博客 603
上一篇: java8新特性详解
下一篇: java8新特性之lambda:lambda的结构和使用
隐者诡道
博客等级 码龄11年 13粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值