Lambda


Lambda

一、Lambda表达式

JAVA8新特性,来源于数学中的 λ演算,是一套关于函数(f(x))定义、输入量、输出量的计算方案

Lambda表达式 -> 函数

  使代码变得简洁、紧凑    
  函数式编程

前提:必须有一个函数式接口
有且只有一个抽象方法的接口
@FunctionnalInterface注解
常见的函数式接口

		Runnable / Callable
		Supplier / Consumer	
		Comparator		
		Predicate		
		Function
//可选的大括号{}  1.函数体只有一个语句,省略大括号*
(String msg) -> System.*out*.println("hello"+ msg);
//可选的参数园括号() 2.只有一个参数,省略圆括号,同时省略类型*
msg -> System.*out*.println("hello “ + msg);
//可选的返回关键字return  3.函数体只有一个表达式,省略**return*
(int a, int b) -> a + b
//可选的类型声明 4. 省略参数类型,编译器可以进行推断*
(a, b) -> a + b

方法引用

双冒号 :: 为引用运算符,而它所在的表达式被称为方法引用。如果Lambda要表达的函数方案已经存在于某个方法的实现中,那么则可以通过双冒号来引用该方法作为Lambda的替代者。

System.out 对象中有一个重载的 println(String) 方法恰好就是我们所需要的。那么对于
printString 方法的函数式接口参数,对比下面两种写法,完全等效:

  • Lambda表达式写法: s -> System.out.println(s);
  • 方法引用写法: System.out::println

第一种语义是指:拿到参数之后经Lambda之手,继而传递给 System.out.println 方法去处理。
第二种等效写法的语义是指:直接让 System.out 中的 println 方法来取代Lambda。两种写法的执行效果完全一样,而第二种方法引用的写法复用了已有方案,更加简洁。

注:Lambda 中 传递的参数 一定是方法引用中 的那个方法可以接收的类型,否则会抛出异常

二、Stream流

JDK8 Stream API:
https://docs.oracle.com/javase/8/docs/api/index.html

要求:
查找名字中姓张,并且长度为3的人,代码如下:

public class Demo01 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张翠山");
        list.add("张三丰");
        list.add("殷素素");

        //对list集合中的元素进行过滤,只要以张开头的元素,存储到一个新的集合中
        List<String> listA = new ArrayList<>();
        for (String s : list) {
            if (s.startsWith("张")) {
                listA.add(s);
            }
        }

        //对listA集合进行过滤,只要姓名长度为3的人,存储到一个新集合中
        List<String> listB = new ArrayList<>();
        for (String s : listA) {
            if (s.length() == 3) {
                listB.add(s);
            }
        }

        //遍历listB集合
        for (String s : listB) {
            System.out.println(s);
        }

        // 使用Stream实现
        Stream<String> stream = list.stream();
        stream.filter(name -> name.startsWith("张"))
                .filter(name -> name.length() == 3)
                .forEach(name -> System.out.println(name));
    }
}

Stream流特点

	专注于对容器对象的聚合操作
	
	提供串行/并行两种模式
	
	使用Fork/Join框架拆分任务
	
	提高编程效率、可读性

使用步骤

    获取流 -> 中间操作 -> 终结操作

注意:执行了终结操作后,就不能再执行中间操作

中间操作(Intermediate

	map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered、concat

终结操作(Terminal)

	forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 iterator 、anyMatch、 allMatch、 noneMatch、 findFirst、 findAny
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值