栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Lambda

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张翠山");
        list.add("张三丰");
        list.add("殷素素");

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

        //对listA集合进行过滤,只要姓名长度为3的人,存储到一个新集合中
        List 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 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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1021143.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号