专栏首页BanzClublambda表达式与函数式编程

lambda表达式与函数式编程

01—引

lambda表达式是java支持函数式编程的实现方案,很多高级语言已经支持lambda表达式,像python、javascript等。lambda表达式使代码更加简洁,而且在理解了语法之后,可读性也更加好。

02—语法

无参数

// 1. 无参数
// 1.8版本之前 写法
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello world !");
    }
}).start();

// lambda 写法
new Thread(() -> System.out.println("Hello world !")).start();

接受一个参数

  • value省略了类型
  • 省略了参数的小括号
  • 也省略了函数体的大括号
  • forEach 也行函数式编程的写法
List<String> list = Arrays.asList("one", "two", "three");
// 原写法
for(String value : list){
    System.out.println(value)
}
// lambda 写法
list.forEach(value -> System.out.println(value));

// 函数式编程写法
list.forEach(System.out::println);

接受两个参数

// 原写法
list.sort(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
});
// lambda 写法
list.sort((String o1, String o2) -> (o1.compareTo(o2)));
// 函数式编程写法
list.sort(String::compareTo);

方法引用

objectName::instanceMethod
ClassName::staticMethod
ClassName::instanceMethod

构造器引用

ClassName::new

使用场景

  • 匿名类
  • 线程
  • 比较器
  • 回调
  • 集合操作
    • 类似python的集合操作
    • 和stream组合
List<Integer> list = Arrays.asList(4, 7, 9, 12, 0, 18, 8, 10, 3);
// 取最小值
Integer minValue = list.stream().min((Integer o1, Integer o2) -> (o1.compareTo(o2))).get();
// 排序 取前5位
List<Integer> topFive = list.stream().sorted((Integer o1, Integer o2) -> (o1 - o2)).limit(5).collect(Collectors.toList());
// 打印 大于 10的数
list.stream().filter((v) -> v > 10).forEach(System.out::print);

02—函数式接口 包java.util.function下提供很多函数式接口:

Function 输入参数为类型T, 输出为类型R, 记作 T -> R;

// 打印元素的平方
List<Integer> list = Arrays.asList(4, 7, 9, 12, 0, 18, 8, 10, 3);
Function<Integer, Integer> square = x -> x * x; // 平方
list.forEach(x -> System.out.println(square));

Consumer 输入参数为类型T, 输出为void, 记作 T -> void;

// 打印元素
List<Integer> list = Arrays.asList(4, 7, 9, 12, 0, 18, 8, 10, 3);
Consumer<Integer> print = System.out::println; // 打印操作
list.forEach(print);

Supplier 没有输入参数, 输出为类型T, 记作 void -> T;

List<Integer> list = Arrays.asList(4, 7, 9, 12, 0, 18, 8, 10, 3);
Supplier<Integer> instance = () -> (1); // 固定值 1
list.add(instance.get());

Predicate 输入参数为类型T, 输出为类型boolean, 记作 T -> boolean

List<Integer> list = Arrays.asList(4, 7, 9, 12, 0, 18, 8, 10, 3);
Predicate<Integer> isEven = x -> x % 2 == 0; // 是否偶数
list.forEach(isEven::test);

还包括二元函数式接口、其他函数式接口,基本上平时编程足够使用,另外也可以自定义函数式接口:

  • @FunctionalInterface 非必须加的注解;
  • 接口中只能包含一个方法;
@FunctionalInterface
public interface IHandler {
    void execute(String v);
}

public class Lambdas {
   // 自定义函数式接口
    private void customize() {
        // 匿名类写法
        IHandler handler = new IHandler() {
            @Override
            public void execute(String v) {
                System.out.println(v);
            }
        };
        handler.execute("匿名类写法");

        // lambda 写法
        IHandler handler_lambda = System.out::println;
        handler_lambda.execute("lambda写法");

        // 方法引用
        IHandler handler_functional = this::execute;
        handler_functional.execute("方法引用写法写法");
    }

    private void execute(String v) {
        System.out.println(v);
    }
}

1、https://blog.csdn.net/xinghuo0007/article/details/78607166

2、https://blog.csdn.net/xinghuo0007/article/details/78603908

本文分享自微信公众号 - BanzClub(banz-club),作者:banzclub

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 同步器

    Java提供两种同步机制,一种是内置的synchronize,另外一种就是大名鼎鼎的AQS,基于AQS实现了很多同步器:倒数闩锁(CountDownLatch)...

    搬砖俱乐部
  • 应用层协议之Web应用与HTTP协议

    在1990年,伯纳斯.李开发了超文本传输协议(HTTP)、超文本标记语言(HTML)、统一资源标识符(URL)、第一款Web浏览器和服务器,以及第一批网页,这些...

    搬砖俱乐部
  • TopN问题

    建一个K个数的最小堆,与堆顶比较,大于(等于)堆顶,依次插入堆,超过K个数,踢出堆顶

    搬砖俱乐部
  • LinkedList 基本示例及源码解析(一)

    一、JavaDoc 简介二、LinkedList 继承接口和实现类介绍三、LinkedList 基本方法介绍四、LinkedList 基本方法使用五、Linke...

    cxuan
  • Python高效编程技巧

    ###Python高效编程技巧 如果你发现一个好的程序库,符合你的要求,不要不好意思————大部分的开源项目都欢迎捐赠代码和欢迎提供帮助——即使你不是一个Pyt...

    xiangzhihong
  • 算法之冒泡排序

    冒泡排序算法需要遍历几次数组。每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变。由于较小的值像“气泡”一样逐渐浮想顶部,...

    xiangzhihong
  • Python的这几个技巧,简直屌爆了

    我已经使用Python编程有多年了,即使今天我仍然惊奇于这种语言所能让代码表现出的整洁和对DRY编程原则的适用。这些年来的经历让我学到了很多的小技巧和知识,大多...

    测试小兵
  • 5个常常被大家忽略的Python小技巧

    下面我挑选出的这几个技巧常常会被人们忽略,但它们在日常编程中能真正的给我们带来不少帮助。

    昱良
  • 如何遍历文件夹下上亿文件而不栈溢出

    序:一个文件夹下面有很多层的小文件,如何算出这个文件夹下面有多少文件?递归遍历,简单暴力,递归在一般情况确实是比较方便的解决方案,但是当文件夹深度多深,递归的反...

    intsmaze-刘洋
  • 如何遍历文件夹下上亿文件而不栈溢出

    序:一个文件夹下面有很多层的小文件,如何算出这个文件夹下面有多少文件?递归遍历,简单暴力,递归在一般情况确实是比较方便的解决方案,但是当文件夹深度多深,递归的反...

    intsmaze-刘洋

扫码关注云+社区

领取腾讯云代金券