前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

中秋去了躺上海,在外滩上打了个卡:

紧接着学了一下Java的函数式编程,给大家整理了一下,一起学习!

一、Lambda用法

之前写Optional这个类的时候,简单说了一下Lambda是怎么用的,这里再跟大家一起回顾一下,Lambda的语法是这样的:

以Lambda语法创建线程和匿名内部类创建线程的区别(显然代码少了很多!):

public static void main(String[] args) {
// 用匿名内部类的方式来创建线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("公众号:Java3y---关注我!");
}
}); // 使用Lambda来创建线程
new Thread(() -> System.out.println("公众号:Java3y---关注我!"));
}

使用Lambda表达式,实际就是创建出该接口的实例对象

图示;Runnable接口来举例:

使用Labmda表达式需要函数式编程接口,比如在Runnable接口上我们可以看到@FunctionalInterface注解(标记着这个接口只有一个抽象方法)

1.1 函数式编程接口

从上面的代码例子可以看出,我们使用Lambda表达式创建线程的时候,并不关心接口名,方法名,参数名。我们只关注他的参数类型,参数个数,返回值

JDK原生就给我们提供了一些函数式编程接口方便我们去使用,下面是一些常用的接口:

简单说明一下:

  • 表格中的一元接口表示只有一个入参,二元接口表示有两个入参

Demo:

// Consumer 一个入参,无返回值
Consumer<String> consumer = s-> System.out.println(s);
consumer.accept("Java3y"); // Supplier 无入参,有返回值
Supplier<String> supplier = () -> "Java4y";
String s = supplier.get();
System.out.println(s); //.....

使用Lambda时,要记住的就两点:

  1. Lambda返回的是接口的实例对象
  2. 有没有参数、参数有多少个、需不需要有返回值、返回值的类型是什么---->选择自己合适的函数式接口

1.2 方法引用

在学Lambda的时候,还可能会发现一种比较奇怪的写法,例如下面的代码:

// 方法引用写法
Consumer<String> consumer = System.out::println;
consumer.accept("Java3y");

如果按正常Lambda的写法可能是这样的:

// 普通的Lambda写法
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("Java3y");

显然使用方法引用比普通的Lambda表达式又简洁了一些。

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

方法引用又分了几种:

  • 静态方法的方法引用
  • 非静态方法的方法引用
  • 构造函数的方法引用

方法引用Demo:

public class Demo {
public static void main(String[] args) {
// 静态方法引用--通过类名调用
Consumer<String> consumerStatic = Java3y::MyNameStatic;
consumerStatic.accept("3y---static"); //实例方法引用--通过实例调用
Java3y java3y = new Java3y();
Consumer<String> consumer = java3y::myName;
consumer.accept("3y---instance"); // 构造方法方法引用--无参数
Supplier<Java3y> supplier = Java3y::new;
System.out.println(supplier.get());
}
} class Java3y {
// 静态方法
public static void MyNameStatic(String name) {
System.out.println(name);
} // 实例方法
public void myName(String name) {
System.out.println(name);
} // 无参构造方法
public Java3y() {
}
}

结果如下:

最后

Lambda虽然代码看起来是简洁,但是如果复杂的话还是比较难看明白的。

在学习Lambda的时候,首先我们得知道有哪些常用函数式编程接口,这些函数式编程接口的有什么区别(参数个数、返回值类型)

Lambda表达式返回的是接口对象实例,如果函数式接口的实现恰好可以通过调用一个方法来实现,那么我们可以使用方法引用来替代Lambda表达式

最后再完整举个例子:

// Supplier是一个无入参带返回的值的函数式编程接口

// () -> new Java3y()这整句Lambda表达式,返回的是Supplier接口的实例。从Lambda表达式可以看出无参数,带返回值
Supplier<Java3y> supplier = () -> new Java3y(); // 由于这个“() -> new Java3y()”Lambda表达式可以通过调用一个方法就实现了,那么我们可以优化成方法引用
Supplier<Java3y> supplier2 = Java3y::new;

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,关注即可获取!

觉得我的文章写得不错,点

最近学习到的Lambda表达式的更多相关文章

  1. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  2. 高放的c++学习笔记之lambda表达式

    lambda表达式:可以让代码看起来更整洁,有些结构简单且用的次数少的函数可以用lambda表达式替代, 通常结构是这样的[捕获列表](参数列表){函数部分} 捕获列表: lambda表达式如果在一个 ...

  3. Java学习笔记--Java8 Lambda表达式

    Java Lambda表达式入门:http://blog.csdn.net/renfufei/article/details/24600507 lambda内容的介绍:http://swiftlet. ...

  4. C++ 11学习(1):lambda表达式

    转载请注明,来自:http://blog.csdn.net/skymanwu #include <iostream> #include <vector> #include &l ...

  5. (二)jdk8学习心得之Lambda表达式

    二.Lambda表达式 1. 格式 (参数1,参数2,…,参数n)->{方法体} 注意: (参数1,参数2,...,参数n)要与方法接口中的参数一致,但是名字可以不一样. 此外,方法类型接口,有 ...

  6. java8学习笔记之lambda表达式

    1.lambda表达式特点 lambda表达式可以理解为可传递的匿名函数的一种方式,无名称,但有参数列表和函数体以及返回类型,可能还有一个可抛出异常的列表. 2.lambda表达式基本语法 (para ...

  7. Python学习笔记:lambda表达式

    lambda表达式:通常是在需要一个函数,但又不想去命名一个函数的时候使用,即匿名函数. 示例如下: add = lambda x,y : x+ y add(1,2) # 结果为3 1.应用在函数式编 ...

  8. Java8新特性学习笔记(一) Lambda表达式

    没有用Lambda表达式的写法: Comparator<Transaction> byYear = new Comparator<Transaction>() { @Overr ...

  9. java 8 学习二(Lambda表达式)

    粗略的概括:lambda表达式主要用来实现“函数接口”中“唯一”的抽象方法用的. 他的特殊版有 方法引用,构造函数引用,用对应的接口实例接收即可. 可以把Lambda表达式理解为简洁地表示可传递的匿名 ...

随机推荐

  1. 基于SpringBoot从零构建博客网站 - 分页显示文章列表功能

    显示文章列表一般都是采用分页显示,比如每页10篇文章显示.这样就不用每次就将所有的文章查询出来,而且当文章数量特别多的时候,如果一次性查询出来很容易出现OOM异常. 后台的分页插件采用的是mybati ...

  2. 四六级成绩还可以这样查?Python助你装B一步到位!!!

    昨天有很多同学在朋友圈秀六级成绩 一个个都如(sang)此(jin)优(tian)秀(liang) 当然也有悲催的哥们 对于上面这位老弟 我只能说:骚呢,兄弟 这种事都能赶上,必须点赞 一.需求分析 ...

  3. .NET Core C#中级篇2-5 常见实用类

    .NETCore CSharp 中级篇2-5 本节内容为常见实用类和方法的使用 String.Format string.format方法是一个字符串格式化类,它里面的一些写法是对字符串进行指定格式的 ...

  4. idea + springboot 的java后台服务器通过小米推送

    public class XiaomiPush { // 1.小米推送(我只推送Android且只应用regId发起推送,所以下面只有推送Android的代码 private static final ...

  5. ts 学习笔记 - 泛型

    目录 泛型 举个栗子 泛型约束 多个参数时也可以在泛型约束中使用类型参数 泛型接口 泛型类 泛型参数的默认类型 泛型 泛型(Generics)是指在定义函数.接口或者类的时候, 不预先指定其类型,而是 ...

  6. Hive on Tez 中 Map 任务的数量计算

    Hive on Tez Mapper 数量计算 在Hive 中执行一个query时,我们可以发现Hive 的执行引擎在使用 Tez 与 MR时,两者生成mapper数量差异较大.主要原因在于 Tez ...

  7. GO.数据库接口

    Go没有内置的驱动支持任何的数据库,但是Go定义了database/sql接口,用户可以基于驱动接口开发相应数据库的驱动. 目前NOSQL已经成为Web开发的一个潮流,很多应用采用了NOSQL作为数据 ...

  8. Spring Cloud开发人员如何解决服务冲突和实例乱窜?(IP实现方案)

    一.背景 在我上一篇文章<Spring Cloud开发人员如何解决服务冲突和实例乱窜?>中提到使用服务的元数据来实现隔离和路由,有朋友问到能不能直接通过IP来实现?本文就和大家一起来讨论一 ...

  9. HDU 4280 Island Transport(无向图最大流)

    HDU 4280:http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意: 比较裸的最大流题目,就是这是个无向图,并且比较卡时间. 思路: 是这样的,由于是 ...

  10. HDU - 3416-Marriage Match IV (最大流 + 最短路)

    HDU - 3416:http://acm.hdu.edu.cn/showproblem.php?pid=3416 参考:https://www.cnblogs.com/kuangbin/archiv ...