java8-lambda(1)

用java1.8的lambda表达式创建线程 今天在别人的代码里见到了一个新东西,以前没有见过,所以了解了一下——“->”,这个像箭头一样的表达式,是java 里的lambda表达式,他的作用就是用来简化代码书写的(坑队友),可能还有其他特性,不过我只了解到了他能简化代码这一块,后面的没有再去了解,原因是因为这东西真的没啥可读性,公司项目里是不会用的。不过,防止别人用了看不懂,还是得学一学。 首先,这个表达式是java1.8的新特性,如... 阅读详情

1. 前言

Java 8 新特性简介

  • 速度更快
    • 修改底层数据结构:如HashMap(数组-链表-红黑树),HashSet,ConcurrentHashMap(CAS算法)
    • 修改垃圾回收机制:取消堆中的永久区(PremGen)->回收条件苛刻,使用元空间(MetaSpace)->直接使用物理内存->加载类文件
  • 代码更少(增加了新的语法Lambda表达式)
  • 强大的Stream API
  • 便于并行
  • 最大化减少空指针异常 Optional容器类

lambda最主要的使用场景:

  1. 替代匿名类,如runnable、comparetor等;
  2. 遍历集合;
  3. map(),reduce()等;
  4. filter();

lambda的语法:

  1. (params) -> expression;
  2. (params) -> statement;
  3. (params) -> {statements}
    如果你的方法并不改变任何方法参数,比如只是输出,那么可以简写如下:
    () -> System.out.println("Hello Lambda Expressions");
    如果你的方法接受两个方法参数,如下:
    (int even, int odd) -> even + odd

2. 示例

2.1.1 lambda替代匿名类1

实现比较器:
before java8:

     Comparator<Integer> comparator = new Comparator<Integer>() {
         @Override
         public int compare(Integer o1, Integer o2) {
             return o2-o1;//降序
         }
     };
     TreeSet treeSet = new TreeSet(comparator);

或者直接将比较器写在需要比较器的位置:

	  List list = new ArrayList();
      list.add(1);
      list.add(2);
      Collections.sort(list, new Comparator<Integer>() {
          @Override
          public int compare(Integer o1, Integer o2) {
              return o2 - o1;//降序
          }
      });
      System.out.println(list);//[2,1]

java8:
在需要匿名类的地方,即通过new接口再实现的地方,都可以使用lambda:
实现比较器只需要:

	Comparator<Integer> comparator1 = (x,y)->y-x;//降序

or:

    Comparator<Integer> comparator2 = (x,y)->Integer.compare(y,x);//降序

    TreeSet<Integer> treeSet = new TreeSet<>(comparator1);
    treeSet.add(1);
    treeSet.add(2);
    System.out.println(treeSet);//[2,1]

2.1.2 lambda替代匿名类2

实现线程
before java8:

    @Test
    public void threadTest(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("new thread..."+Thread.currentThread().getName());
                //Thread-0
            }
        }).start();
        System.out.println(Thread.currentThread().getName());//main
    }

以上代码有两个线程,Thread-0和main(都为默认名)。 Thread方法需要一个线程实例,传统方法仍然是new接口的实现来实现。

java8:
替代匿名类,需要关注的是:
是对接口中待实现方法的实现,因此要对应到原方法中的参数

   new Thread(()-> System.out.println(Thread.currentThread().getName())).start();
    //Thread-1

上述run方法中无参数,因此lambda中只需()即可


2.1.3 lambda替代匿名类的综合示例

对以下员工信息进行年龄和薪水过滤

@Setter @Getter @AllArgsConstructor @ToString
public class Employee {
    private int age;
    private int salary;
}

通常有的方法有:

① 普通过滤方法(缺点:扩展性差)

 public List<Employee> filterEmplyeesByAge(List<Employee> list){...}
 public List<Employee> filterEmplyeesBySalary(List<Employee> list){...}
 public List<Employee> filterEmplyeesByOther(List<Employee> list){...}

当需要增加过滤条件时,就需要写很多的过滤方法。为了改进,我们可以只写一个过滤方法,传入过滤添加即可。如下。

优化1:

②策略设计模式

我们需要写一个过滤接口,再写实现类。用于识别不用的过滤方法。

(A) 过滤接口:

public interface MyPredicate<T> {
    boolean filter(T t);
}

其中,T表示要过滤的类型,如果该接口不再用于其他类的过滤,其实这里可以写死Employee。

(B) 接口的实现类

public class EmployeeSalaryFilter implements MyPredicate<Employee> {
    @Override
    public boolean filter(Employee emp) {
        return emp.getSalary()>2000;
    }
}

这里是一个过滤工资的类。是通过实例作为参数传入到过滤方法的。通用过滤方法如下:

(C ) 通用过滤方法

    public static List<Employee> filterEmployee(List<Employee> emps,MyPredicate<Employee> myPredicate){
        List<Employee> res = new ArrayList<>();
        for (Employee emp : emps) {
            if(myPredicate.filter(emp)){
                res.add(emp);
            }
        }
        return res;
    }

测试:

	@Test
    public void employeeTest(){
        Employee e1=new Employee(20,1800);
        Employee e2=new Employee(30,2800);
        Employee e3=new Employee(40,3800);
        List<Employee> employees = new ArrayList<>();
        employees.add(e1);
        employees.add(e2);
        employees.add(e3);
        //1.策略方法过滤
        List<Employee> emps = Employee.filterEmployee(employees,new EmployeeSalaryFilter());
        System.out.println(emps);
        //[Employee(age=30, salary=2800), Employee(age=40, salary=3800)]

    }

分析:上述策略模式
优点是:

  • 过滤方法只写了一个,过滤的方法,实际上调用的是过滤类中的过滤方法;

缺点是:

  • 增加不同的过滤时,需要写不同的实现类来实现,繁琐。

优化2:

对于每次新增过滤条件时,都要写实现类,来实现接口,比较繁琐,可能要实现很多个接口:

public class EmployeeSalaryFilter implements MyPredicate<Employee> {...}
public class EmployeeAgeFilter implements MyPredicate<Employee> {...}
public class EmployeeOtherFilter implements MyPredicate<Employee> {...}
...

单独创建类是非常多余的,因此优化方式是:匿名内部类。

	@Test
    public void employeeTest(){
        Employee e1=new Employee(20,1800);
        Employee e2=new Employee(30,2800);
        Employee e3=new Employee(40,3800);
        List<Employee> employees = new ArrayList<>();
        employees.add(e1);
        employees.add(e2);
        employees.add(e3);
        //1.策略方法过滤
        List<Employee> emps = Employee.filterEmployee(employees,new EmployeeSalaryFilter());
        System.out.println(emps);//[Employee(age=30, salary=2800), Employee(age=40, salary=3800)]
        
        //2.上述方式使用匿名内部类改进
        List<Employee> emps2 = Employee.filterEmployee(employees, new MyPredicate<Employee>() {
            @Override
            public boolean filter(Employee employee) {
                return employee.getSalary()>2000;
            }
        });
        System.out.println(emps2);
        //[Employee(age=30, salary=2800), Employee(age=40, salary=3800)]

    }

分析:上述匿名内部类,不需要额外再写实现类,再需要使用的时候,直接用内部类实现。

优化3:
lambda

   //3.lambda
    List<Employee> emps3 = Employee.filterEmployee(employees,(e)->e.getSalary()>2000);
    emps3.forEach(System.out::println);

优化4:
stream api

   //4.stream() api
   List<Employee> emps4 = employees
           .stream()
           .filter(e->e.getSalary()>2000)
           .collect(Collectors.toList());
   System.out.println(emps4);
   //[Employee(age=30, salary=2800), Employee(age=40, salary=3800)]
   System.out.println("------------------");

   employees.stream()
            .map(Employee::getAge)
            .forEach(System.out::println);
【BlueDroid】【PBAP】蓝牙电话本协议之同步通讯录分析(超详细) Header - Type = "x-bt/vcard-listing":代表了该Request对应的Function为PullvCardListing;Profile:PBAP (4),上层应用层协议为PBAP,OBEX协议的上层应用层协议除了PBAP,还有OPP、MAP协议;Response in Frame:该request frame-485对应的Response frame为489;在PBAP协议同步通讯录和通讯记录中,都是基于OBEX协议实现的,PBAP协议作为了应用层协议; 阅读详情

相关推荐

PCIe中ACS知识小记

虚拟机内部的访问数据显而易见是带的GPA地址。而目前几乎所有的PCIe 设备都带ACS control,所以它们可以单独assign给不同的VM,但是随之而来的就是即使两个GPU同时assign给同一个VM,由于ACS的存在,他们之间也不会有真正的物理层面的P2P访问。每一个TLP都自带一个address(寻址类TLP),同时每一个endpoint,PCIe switch都自带一段BIOS配置的地址空间范围,一旦这个TLP的address落入某个设备的地址范围,那么这个TLP就属于这个设备并消费。

Summer的博客 5077

Python函数(1)lambda

一、lambda函数 1、lambda函数基础: lambda函数也叫匿名函数,即,函数没有具体的名称,而用def创建的方法是有名称的。如下: """命名的foo函数""" def foo():return 'beginman' #Python中单行参数可以和标题写在一行 """lambda关键字创建匿名函数,该表达式同以上函数""" lambda:'beginman' ...

weixin_30628801的博客 216

机械设计师必看:如何用Autodesk Inventor高效完成钣金设计(附实战案例)

本文为机械设计师详细解析了如何利用Autodesk Inventor Professional高效完成钣金设计。文章通过一个钣金防护罩的实战案例,系统介绍了从核心设计逻辑、建模流程、参数化技巧到工程图输出的完整工作流,旨在帮助设计师掌握智能化的设计方法,显著提升从概念到制造的设计效率与准确性。

honey的博客 1180

lambda表达式(1)

简单的流操作 image.png 常用流操作: 1、collect(toList()) image.png 2、map:如果一个函数可以将一种类型的值转换成另一种类型,map操作就可以使用该函数,将一个流中的值转换成一个新的流 image.png 3、filter,遍历数据...

weixin_34342207的博客 241

ESP32-S3驱动雨滴传感器实战:从原理到ADC/GPIO双模式数据采集

本文详细介绍了ESP32-S3驱动雨滴传感器的实战教程,涵盖其工作原理及ADC/GPIO双模式数据采集方法。通过解析传感器利用水的导电性检测雨量的核心机制,提供了完整的硬件连接方案与软件驱动代码,包括模拟量(AO)的ADC读取和数字量(DO)的GPIO读取,并附有调试技巧,帮助开发者快速实现雨滴检测功能。

weixin_32005771的博客 154

C#实现Socket通信同时监听多客户端(附完整源码)

C#实现Socket通信同时监听多客户端(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 427

lambda (一)

java8 5种 新特性: 1、接口中可以写默认的实现方法 2、lambda表达式 3、函数式接口 4、方法与构造函数引用 5、Stream 接口 1、接口中可以写默认的实现方法 public interface Java8Interface { String getAge(); /** * 不需要子类去实现可以直接调用 * @return */ default String getName(){ return "我是接口方法";

zhanglinlang的专栏 229

WOFOST作物模型(1):PCSE环境配置

get_summary_output() 方法通常用于在 PCSE 模拟过程结束后,获取模拟结果的摘要信息,例如模拟期间的总产量、总水分需求等。它可以提供对模拟结果的快速总结,方便用户进行后续的分析和处理。用.get_output来获取过程参数,并将这些参数转为dataframe显示。用run_till_terminate()代表终止。安装好之后,打开jupyter notebook。也可以指定运行时间,并获取最后一天的参数。首先还是打开之前建好的gee虚拟环境。

所有专家都曾始于新手 681

lambda-1-lambda简介

lambda用法 1、函数式接口 函数式接口用@FunctionalInterface注解标注的接口类,lambda必须和函数式接口的抽象函数描述一样的参数类型。 @FunctionalInterface interface Converter<F, T> { T convert(F from); } 可以使用lambda接口实现Converter接口 Converter&...

daiyuxiong的博客 632

[QMT量化交易小白入门]-七十三、主力资金动向:板块与个股资金流数据API(量化python代码解析)

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1111

silero-vad 训练自己的数据

silero-vad 训练自己的数据

jacke121的专栏 815

Lambda 表达式(一)

“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达...

mwthe的博客 386

C语言试题四之计算并输出3到n之间所有素数的平方根之和

1、题目 请编写函数function,它的功能是:计算并输出3到n之间所有素数的平方根之和 例子:若我们main函数从键盘给n输入5之后,我们需要输出结果为3.968119 输入值n的要求:正整数n, 要求小于100。 2、部分函数说明 C 库函数 double sqrt(double x) 返回 x 的平方根 3、源代码实现 #include <stdio.h> #...

码莎拉蒂 7232

Java1.8Lambda

这里写自定义目录标题Java1.8-Lambda表达式表现形式为什么用如何用思考 Java1.8-Lambda表达式 简单概括:Java1.8之前方法仅能传递值(变量、对象的引用等),1.8之后方法内可以传递行为、代码或者表达式。这就是Lambda表达式所实现的功能。你可以将Lambda表达式想象成为匿名函数中方法的具体执行过程以便理解。其特点可以用简洁来形容。 表现形式 (parameters)...

xuchengshantttt的博客 382

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

在Java 1.8里,如何用Lambda实现递归?

用阶乘函数 n! = n * (n-1)! 作为例子: @FunctionalInterface static interface IntFunc {     int apply(int n); }   public static void main(String[] args) {     IntFunc factor = n ->

小巫师的专栏 6481

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java1.8 lambda表达式_java1.8之Lambda表达式

行为参数化为了应对多变的需求,难道我们就要因为客户每提出一个需求,我们就要写一个方法去实现吗?显然这样做很冗余,而且维护性大大降低,这说明代码的设计不够好。好在已经有前人帮我们提出了行为参数化思想(即将一段代码逻辑作为参数,使之可以在不同对象间传递)。java1.8以前使用匿名类来实现行为参数化,即使用匿名类去实现一个函数式接口中的方法。java1.8之后,推出了Lambda表达式来替代以前匿名类...

weixin_36098968的博客 946

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java 1.8 lambda表达式_Java JDK 1.8 lambda的用法详解

具体代码如下所示:public class Student {private String id;private String name;private String age;private String address;public Student(String id, String name, String age, String address) {this.id = id;this.nam...

weixin_34596480的博客 337

Lambda表达式 Java1.8

Lambda表达式,一看这个写法,我就联想到了ES6中的箭头函数,因为女朋友是做前端的,之前跟她一起学过一些前端的知识,不过学识尚浅,如果有什么想切磋的,直接联系我就好了。 Lambda表达式是在Java 1.8后出现的,他是针对接口中只有一个抽象方法,可用@FunctionalInterface修饰告诉JVM,这样JVM就不用挨个的去判断是否只包含一个JVM了。凡是提出某个技术,我就愿意去从它...

LoganMaaa的博客 281

java 1.8 lambda表达式1

java 1.8新特性 最核心lambda和stream Api lambda表达式 箭头操作符 “->” 左侧:lambda参数列表 右侧:lambda表达式中所需要的功能. 即lambda体 语法格式一: 无参数: `public static void main(String[] args) { //注意事项,如果里面引用了局部变量 jdk1.7以前需要finally修...

单人影的博客 236

JAVA1.8新特性之lambda遍历集合

    public static void main(String[] args) {         // 初始数据         Map&lt;String, Integer&gt; smap = new HashMap&lt;&gt;();         smap.put("1", 11);         smap.put("3", 33);         smap.put("2"...

No_be_IT_movers的博客 1886

Java1.8新特性Lambda表达式

Lambda表达式是java1.8新特性,Lambda表达式是一种匿名函数,可以作为参数传递给其他函数或方法,并且可以在需要时动态创建,主要用途是简化代码。匿名内部需要的类型可以是类、抽象类、接口。lambda表达式需要的接口只能是接口。

万维网连五洲,二进制写尽天下事,喜欢结识新伙伴寻找志同道合的朋友,欢迎一起探讨学习 1061

Java1.8-Lambda

写的很全很好的一个博客:http://blog.youkuaiyun.com/ioriogami/article/details/12782141 什么是函数接口:http://www.lambdafaq.org/what-is-a-functional-interface/肤浅的理解就是:函数注解的接口是这样一个类型,这个类型的作用相当于一个函数;这个接口定义切且只定义了一个抽象方法...

aqxs1109的博客 77

【java】java1.8  Lambda  表达式类型

背景和语法 java1.8 lambda 的本质是一个语法糖 由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。 lambda表达式允许你通过表达式来代替功能接口。 lambda表达式允许你将类作为一个参数传递 lambda表达式可以大大简化代码量(增加代码理解那么毒) lambda表达式和 stream 是自Java语言添加泛型(Generics)和注...

qq_32265719的博客 272

java1.8 lambda表达式语法(二)

本文接上一篇java1.8 lambda表达式初识(一),系统的介绍lambda表达式的语法。1.为什么引入lambda表达式; lambda表达式是一个可传递的代码块,可以在以后执行一次或者多次。我们可以观察java在哪里遇到了这种代码块。例如我们想按照长度对字符串数组进行排序而不是按照默认的字典顺序排序,可以向Arrays.sort方法传入一个Comparator对象:class Length

我是菜鸟 816

Java 1.8版本之后的Lambda表达式

Lamda表达式 Lamda表达式在1.7版本之前是无法表达的,在1.8之后为了简化代码,出现了Lamda表达式。 这里我创建了两个test.java类 test.java( 正常表示 ) interface IMessage { public void send(String str); } public class test { public static void main(String[] args) { IMessage msg = new IMessage() {

探索技术与实践的旅程,分享编程经验与工具使用心得,助力开发者提升技能。 580

Java1.8 关于Lambda表达式序列化问题

Lambda表达式是1.8特别重要的一个新增内容。 之前学习的时候,只注意了书上关于它的使用,语义等。直到前几天有个面试官问我: 问:Lambda表达式知道吗? 答:知道啊。(心里活动:问我问我,这个我前几天刚看过) 问:使用了Lambda表达式的对象可以序列化吗?为什么? 答:WTF???404 not find。您的问题超出了我的知识储备。 今天特地对这个问题进行了实验,顺便把La...

西瓜shine 3703
上一篇: quartz详解5-quartz与spring结合
下一篇: Guava Cache
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值