public class Test05 {
/*
* lambda表达式是用来简化匿名内部类的一种函数式编程的语法。
* 只有SAM接口才能使用lambda表达式
* 方法引用和构造器引用是用来简化lambda表达式。
* 只有当lambda表达式满足一些特殊情况时,才能使用方法引用和构造器引用。
*
* 条件:
* (1)当Lambda体的实现是通过调用一个现有的方法来完成功能时
* (2)要求函数式接口的抽象方法返回值类型与该方法的返回值类型要对应。
* (3)要求函数式接口的抽象方法的形参列表与该方法的形参列表对应
* 或者
* 要求函数式接口的抽象方法的形参列表的第一个形参是作为调用方法的对象,剩余的形参正好是给这个方法的实参列表
*
* 方法引用的语法格式:
* (1)对象::实例方法名
* (2)类名::静态方法名
* (3)类名::实例方法名
*
* 条件:
* (1)当Lambda体的实现是通过创建一个对象来实现的
* (2)要求函数式接口的抽象方法返回值类型与该对象的类型一致
* (3)要求函数式接口的抽象方法的形参列表与该对象创建时的构造器的形参列表对应
*
* 构造器引用语法格式:
* (1)类名::new
* (2)数组类型::new
*/
public static void main(String[] args) {
// test01();
// test02();
// test03();
// test04();
//     test05();
      test06();

} public static void test01() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); /*
* default void forEach(Consumer<? super T> action)
* 形参的类型是Consumer接口,可以使用Lambda表达式赋值
* Consumer<T> void accept(T t)
*
*/ //list.forEach(num -> System.out.println(num));
//以前我的输出是带有箭头的,但是换成方法引用后可以更加的简便
/*
* (1)这里的lambda表达式是通过调用一个现有的方法来完成的,是out对象的println()方法来完成
* (2)Consumer<T> public void accept(T t)
* PrintStream类的out对象 public void println(Object x)
*/
//对象::实例方法名
list.forEach(System.out::println);
}
public static void test02() {
/*
* Stream的
* public static<T> Stream<T> generate(Supplier<T> s)
* 形参是Supplier接口类型,赋值为Lambda表达式
*
* (1)抽象方法 T get()
* (2)如何实现, 用Math.random()随机产生一个[0,1)范围的数
*/
// Stream<Double> stream = Stream.generate(() -> Math.random()); /*
* Supplier接口的抽象方法 T get() Double get()
* 调用的是 double Math.random()
*/
//使用方法引用 类名::静态方法名
Stream<Double> stream = Stream.generate(Math::random);
stream.forEach(System.out::println);
} public static void test03(){
String[] arr = {"bmw","Mercedes-benz","audi","Porsche","Ferrari"}; //不区分大小写的排序
/*
* public static <T> void sort(T[] a, Comparator<? super T> c)
* 第二个形参:Comparator接口,SAM接口,赋值为Lambda表达式
*
* Comparator<String>接口的抽象方法:
* int compare(String s1, String s2)
* 如何实现?不区分大小写比较字符串
*/
// Arrays.sort(arr);
//排序结果[Ferrari, Mercedes-benz, Porsche, audi, bmw] // Arrays.sort(arr, (s1,s2) -> s1.compareToIgnoreCase(s2));
//排序结果[audi, bmw, Ferrari, Mercedes-benz, Porsche]
/*
* Comparator<String>接口 int compare(String s1, String s2)
* String类的 int compareToIgnoreCase(String str) 此处,s1正好是调用compareToIgnoreCase的对象,s2是给它的参数
*/
//使用方法引用优化
Arrays.sort(arr, String::compareToIgnoreCase);
//排序结果[audi, bmw, Ferrari, Mercedes-benz, Porsche]
System.out.println(Arrays.toString(arr));
}
public static void test04(){
//lambda表达式也可以用于给SAM接口的变量赋值
/*
* Supplier<T> 接口的抽象方法 T get()
* 如何实现这个抽象方法,例如:这里要new一个String的空对象
*/
// Supplier<String> s = () -> new String(); //就可以使用构造器引用,来创建对象
Supplier<String> s = String::new;
} public void test05(){
//调用createArray这个方法,创建一个2的n次方长度的数组
/*
* public <R> R[] createArray(Function<Integer,R[]> fun,int length)
* 第一个参数:Function<Integer,R[]>接口 ,是SAM接口,可以赋值为Lambda表达式
* Function<T,R>接口的抽象方法: R apply(T t)
*
* R[] apply(Integer i)
* 如何实现,创建一个长度为i的R类型的数组
*
*/
// String[] arr = createArray((Integer i) -> new String[i], 10);
//优化为 String[] arr = createArray(String[]::new, 10);
System.out.println(Arrays.toString(arr));
System.out.println(arr.length);
} /*
* 模仿HashMap的源码实现的一个方法,功能是,可以创建一个2的n次方长度的数组
* 例如:这个length是你希望的数组的长度,但是它可能不是2的n次方,那么我会对length进行处理,纠正为一个2的n次方长度,并且创建这个数组
*/
public <R> R[] createArray(Function<Integer,R[]> fun, int length){
int n = length - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
length = n < 0 ? 1 : n + 1;
return fun.apply(length);
} public void test06(){
new Thread(() -> System.out.println("hello")).start();//不能使用方法引用来优化
}
}

Lombda表达式(五)的更多相关文章

  1. Lombda表达式(四)

    /* * 自定义函数式接口: * 1.声明一个接口,只能包含一个抽象方法 * 2.给这个接口加@FunctionalInterface */ public class Test { public st ...

  2. Python函数式编程之lambda表达式

    一:匿名函数的定义 lambda parameter_list: expression 二:三元表达式 条件为真时返回的结果 if 条件判断 else 条件为假的时候返回的结果 三:map map(f ...

  3. 微软BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)

    [公告]本博客于2015年10月起不再更新 新博客文章主要发表在商业智能BI社区: http://www.flybi.net/blog/biwork 博客地图自动分类 文章目录方便更好的导航,阅读文章 ...

  4. 嵌入式Linux应用开发——Linux下的C编程基础

    一.markdown简单操作 1.标题 在文字开头加上 “#”,通过“#”数量表示几级标题. 通过在文字下方添加“=”和“-”,他们分别表示一级标题和二级标题. 2.块注释 通过在文字开头添加“> ...

  5. ASP.NET验证控件应用实例与详解。

    ASP.NET公有六种验证控件,分别如下:  控件名      功能描叙 1RequiredFieldValidator(必须字段验证)  用于检查是否有输入值 2CompareValidator(比 ...

  6. C语言控制语句总结(if else for switch while break continue)

    一.if语句 1表达式 if(条件表达式) 语句 注: (1)条件表达式,一般为逻辑表达式或关系表达式,但也可以是任何数值类型,如整型.实型.字符型.指针型数据等. (2)语句,由于是C语言的语句,而 ...

  7. webform 验证控件

    验证: 一.非空验证  RequiredFieldValidator ErrorMessage - 验证出错后的提示信息 ControlToValidate - 要验证的控件的ID Display - ...

  8. Python学习之路——函数

    一.Python2.X内置函数表: 注:以上为pyton2.X内置函数,官方网址:https://docs.python.org/2/library/functions.html 二.Python3. ...

  9. 网站教学 提纲总结到ajax结束后面还有

    Repeater - 重复器五个模板:HeaderTemplate - 在最上面,显示一次FooterTemplate - 最下面,显示一次ItemTemplate - 在中间,显示n次Alterna ...

随机推荐

  1. maximo入门---开发者提要

    1.添加控件 在一个程序设计器里添加控件,控件必须要和这个程序对象(这个程序关联的表)的一个属性绑定 ps maximo挺高级的,比如一个date类型的输入框,会自动给他补上时间控件 2.复制程序 复 ...

  2. 【机器学习】梯度下降 II

    Gradient Descent 梯度下降 II 关于 Gradient Descent 的直观解释,参考上一篇博客[机器学习]梯度下降 I 本模块介绍几种梯度下降模型.定义符号标记如下: \(\th ...

  3. jenkins在windows系统及linux环境安装

    一.下载 jenkins是当前持续集成(Continuous integration,简称 CI)的主流工具,在项目中得到了广泛的推广和应用. 下载地址: https://jenkins.io/dow ...

  4. Jenkins打Docker镜像推送到私有仓库

    Jenkins打Docker镜像推送到私有仓库 因为我的Jenkins是安装在群晖NAS中的docker,所以我这边就以Docker安装Jenkins为例 echo '================ ...

  5. 永远不要在代码中使用“User”这个单词

    ​ 当你意识到你在项目开始时做的轻量.简单的设想竟然完全错了时,你已经用了六个月的时间投入到这个项目上.现在你需要解决这些问题,才能让这个系统继续运行下去,你发现你用在这个项目上的精力远远超出了你的预 ...

  6. MySQL: 2、SQL语言

    一.SQL的简介: 1.SQL的概念: SQL就是结构化查询语言,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统 2.SQL的作用:   - ...

  7. Alink漫谈(二十二) :源码分析之聚类评估

    Alink漫谈(二十二) :源码分析之聚类评估 目录 Alink漫谈(二十二) :源码分析之聚类评估 0x00 摘要 0x01 背景概念 1.1 什么是聚类 1.2 聚类分析的方法 1.3 聚类评估 ...

  8. 路由总结之静态、RIP、OSPF、IS-IS、BGP和策略路由

    路由无疑是当今网络的核心,看到浩如烟海的网络资料,可以让人皓首穷经啊,而且都是浩浩荡荡几百页,所以想搞简单点. 静态路由 静态路由无疑是最简单,也是最基本的. Ip route-static(指定是静 ...

  9. IDEA设置External Tools之Javap反编译字节码

    通过Jdk的命令javap可以反编译查看字节码,但是在使用idea的时候一直用命令行去操作不太好操作,而且因为idea会把class码 放在target里面,经常会忘记切换目录.这个时候idea的Ex ...

  10. Windows下CertUtil校验和编码文件

    目录 前言 CertUtil计算文件hash 计算MD2 计算MD4 计算MD5 计算SHA1 计算SHA256 计算SHA384 计算SHA512 文件base64编码 文件base64解码 文件h ...