lambda表达式

  • Lambda表达式是 Java8 中最重要的新功能之一。使用 Lambda 表达式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看起来更简洁易懂。Lambda表达式同时还提升了对集合、框架的迭代、遍历、过滤数据的操作。

先看一个例子

import java.util.*;public class lambdaDemo {public static void main(String[] args) {//普通实现
//        Thread thread = new Thread(new Runnable() {//            @Override
//            public void run() {//                System.out.println("running");
//            }
//        });
//        thread.start();//lambda表达式写法
//        new Thread(()->{System.out.println("running2...");}).start();//普通写法List<String> list = Arrays.asList("java","c","c++","pyhton");
//        Collections.sort(list, new Comparator<String>() {//            @Override
//            public int compare(String o1, String o2) {//                return o1.length()-o2.length();
//            }
//        });
//        for(String str : list){//            System.out.println(str);
//        }//lambda表达式写法Collections.sort(list, (a,b)->a.length()-b.length());list.forEach(System.out::println);}
}

函数式接口

只有一个抽象方法(Object 类中的方法除外)的接口是函数式接口

常用接口

Supplier 代表一个输出
Consumer 代表一个输入
BiConsumer 代表两个输入
Function 代表一个输入,一个输出(一般输入和输出是不同类型的)
UnaryOperator 代表一个输入,一个输出(输入和输出是相同类型的)
BiFunction 代表两个输入,一个输出(一般输入和输出是不同类型的)
BinaryOperator 代表两个输入,一个输出(输入和输出是相同类型的)

方法的引用

▪ 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法,方法引用提供了一种引用而不执行方法的方式,如果抽象方法的实现恰好可以使用调用另外一个方法来实现,就有可能可以使用方法引用

▪ 静态方法引用:如果函数式接口的实现恰好可以通过调用一个静态方法来实现,那么就可以使用静态方法引用

import java.util.function.Supplier;public class Test2 {static String put(){System.out.println("put...");return "put";}public static void main(String[] args) {Supplier<String> s1 = ()->Test2.put();System.out.println(s1.get());Supplier<String> s2 = Test2::put;System.out.println(s2.get());Supplier<String> s3 = Fun::hehe;System.out.println(s3.get());}
}class Fun{public static String hehe(){return "hehe";}
}

▪ 实例方法引用:如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现,那么就可以使用实例方法引用

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;public class Test3 {public String put(){return "put...";}public void getSize(int size){System.out.println(size);}public String toUpperCase(String str){return str.toUpperCase();}public static void main(String[] args) {Supplier<String> s1 = ()->new Test3().put();Supplier<String> s2 = ()->{return new Test3().put();};Supplier<String> s3 = new Test3()::put;System.out.println(s1.get()+s2.get()+s3.get());Test3 test3 = new Test3();Consumer<Integer> c1 = (size)->test3.getSize(size);Consumer<Integer> c2 = test3::getSize;c1.accept(123);c2.accept(456);Function<String,String> f1 = (str)->str.toUpperCase();Function<String,String> f2 = (str)->test3.toUpperCase(str);Function<String,String> f3 = new Test3()::toUpperCase;Function<String,String> f4 = test3::toUpperCase;System.out.println(f1.apply("abc")+f2.apply("abc")+f3.apply("abc")+f4.apply("abc"));}
}

▪ 对象方法引用:抽象方法的第一个参数类型刚好是实例方法的类型,抽象方法剩余的参数恰好可以当做实例方法的参数。如果函数式接口的实现能由上面说的实例方法调用来实现的话,那么就可以使用对象方法引用

import java.util.function.Consumer;public class Test4 {public static void main(String[] args) {Consumer<Tool> c1 = (Tool tool) -> new Tool().foo();c1.accept(new Tool());Consumer<Tool> c2 = (Tool tool) -> new Tool2().foo2();c2.accept(new Tool());Consumer<Tool> c3 = Tool::foo;c3.accept(new Tool());}
}class Tool{public Integer fun(String s){return 1;}public void foo(){System.out.println("foo");}
}class Tool2{public Integer fun2(String s){return 1;}public void foo2(){System.out.println("foo---foo2");}
}

▪ 构造方法引用:如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法引用

import java.util.function.Consumer;
import java.util.function.Supplier;public class Test5 {public static void main(String[] args) {Supplier<Person> s1 = ()->new Person();s1.get();Supplier<Person> s2 = Person::new;s2.get();Consumer<Integer> c1 = (age)->{new Account(age);};Consumer<Integer> c2 = Account::new;c1.accept(123);c2.accept(456);}
}class Account{public Account(){System.out.println("调用无参构造方法");}public Account(int age){System.out.println("age.构造参数"+age);}public Account(String str){System.out.println("String 构造参数"+str);}
}class Person{public Person(){System.out.println("调用无参的构造方法");}
}
ntln("age.构造参数"+age);}public Account(String str){System.out.println("String 构造参数"+str);}
}class Person{public Person(){System.out.println("调用无参的构造方法");}
}

【java学习之路】(java SE篇)013.lambda表达式相关推荐

  1. 个人开发经历--我的java学习之路(学校篇)

    个人开发经历--我的java学习之路(学校篇) 个人介绍: 姓名: 不在这里说明 联系信息: 个人历程 jdbc阶段 sql生成器 一代代码生成器 servlet阶段 servlet项目中,sql生成 ...

  2. java学习之路---java学习的方法和java学习路线

    转载于: http://blog.csdn.net/zhangerqing 前段时间逛论坛,总会有很多新手很迷茫,问到:到底该怎么学好Java,这个问题很重要,尤其对于像我们这样大多数都是靠自学的人来 ...

  3. Java学习之路-----Java基础简介,基础语法,Java标识符,修饰符,关键字与注释

    这里写目录标题 Java简介 Java发展历程 Java语言平台版本 Java语言的特点 Java语言跨平台原理--JVM JRE和JDK JDK安装路径下的目录解释 Java基础语法 Java标识符 ...

  4. Java学习之路 -- Java怎么学?

    文章目录 java基础怎么学? 学完基础学什么? 几个常用框架学完学什么? MQ JVM的知识跑不掉 微服务等等 其他 数据结构和算法 java基础怎么学? 当时,作为懵懂的小白,大一学习了c和c++ ...

  5. JAVA学习之路--基础篇三

    目录 关于Java中从键盘输入的语句 nextxxx().next().nextLine()的区别 语句 if和if else语句 Switch语句 for语句 while和do..while bre ...

  6. java学习之路目录(已完结)

    java学习之路目录(持续更新中-) 第一阶段 javaSE(完结) 序号 标题 内容 001 java初识 java语言特点.体系结构.运行机制 002 java SE基础语法 注释.关键字.变量. ...

  7. 我的Java学习之路2009-11-17

    -------------------------------2009年3月19日开始----------------------------- 下载JDK Myeclipse Netbeans JB ...

  8. 菜鸟haqima的Java学习之路第一天

    菜鸟haqima的Java学习之路第一天 导读:DOS命令 常用快捷键 Java的简单概述 (第一章 Java开发环境的搭建) 1.常用的DOS命令 1.1.怎么打开DOS命令窗口 win键+r(组合 ...

  9. Java学习之路02_选择方向_旺旺老师

    提示:请您先阅读第一部分:Java学习之路01_软件江湖_旺旺老师 第二部分:帮派之争 就好像玩游戏要先选择角色种族,进入江湖要先选择帮派,那搞软件开发也要选择方向.个人总结的软件开发的方向:嵌入式开 ...

  10. Java学习之路-预科

    Java学习之路-预科 第一章 学习计算机的基本知识 文章目录 Java学习之路-预科 前言 一.什么是计算机? 二.硬件及冯诺依曼结构 1.计算机硬件 1.1 计算机硬件组成 1.2 什么是装机 1 ...

最新文章

  1. Spring-RedisTemplate原理
  2. 线程与消息循环的关系
  3. 如何取得select结果数据集的前10条记录。postgresql
  4. 当 Windows 11 宕机时:从蓝屏死机变成“黑屏死机”!
  5. 如何用 Linux 拨号上网
  6. 蓝桥杯 ALGO-20 算法训练 求先序排列 Java版
  7. uos/deepin设置屏幕缩放比例的命令
  8. java.this的作用包括,智慧职教: 以下不是Java中this关键字的作用的是()。
  9. NetXray使用说明之(6)----捕捉oicq message报文
  10. 安装deepin后没有Windows启动项解决办法
  11. 2022-2028年中国SPA水疗行业市场深度分析及投资前景展望报告
  12. js_中国大陆加港澳台手机正则验证
  13. 属于EDG的奇迹之夜
  14. java pacs上传服务_医疗pacs系统影像数据的同步方法及前置服务器的制造方法
  15. 前端-获取treegrid的选中数据
  16. sql 查询及格率优秀率
  17. 项目启动报错 Error running ‘xxxApplication‘;Command line is too long,Shoerten command line for........
  18. 如何在微信小程序中下载APP?
  19. .crx文件怎么解压
  20. 【论文阅读|深读】 GraphSAGE:Inductive Representation Learning on Large Graphs

热门文章

  1. 测试线程池(Java)
  2. Numpy的使用方法
  3. R语言中GCC编译的问题(续)
  4. 2021.9.11周六PAT甲级考试复盘与总结
  5. apache的日志切割
  6. 线程同步,通信与虚方法
  7. 基于FPGA实现uart串口模块——进阶版1
  8. Php.ini文件位置在哪里 Php.ini文件找不到
  9. Google maps API开发(一)(转)
  10. 装机防骗武器——鲁大师