Java8深入剖析学习记录

什么是lambda表达式?
用于指定匿名函数或者闭包的运算符

为什么用lambda表达式?
在这里插入图片描述

public static void main(String[] args) {
        JFrame jframe = new JFrame("My JFrame");
        JButton jButton = new JButton("My JButton");

// 这里不用指定类型,因为有类型推断机制,但是在根据上下文推断不出来的时候,就需要自己定义了
        jButton.addActionListener(event -> {
            System.out.println("Button Pressed!");
            System.out.println("hello world");
            System.out.println("executed");
        });

        jframe.add(jButton);
        jframe.pack();
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

在这里插入图片描述
此处表示参数类型,为Integer或者Integer的父类,Consumer是Java8一个新的接口。
在这里插入图片描述Consumer代表一个操作,接受一个参数,不返回任何结果。有一个副作用,就是可能会修改这个接受的参数。接收参数i,也可以声明类型Integer i
在这里插入图片描述

在这里插入图片描述Consumer是被@FunctionalInterface标识的接口
函数式接口:一个接口有且只有一个抽象方法。
函数接口的实例可以由lambda函数,方法引用,或者是构造方法引用来创建。
在这里插入图片描述

在这里插入图片描述上图是线程类接口,1.8之后也成为了函数接口,所以可以使用lambda表达式

在这里插入图片描述在这里插入图片描述加了注解,只有一个抽象方法的时候,如果重写Objece中的方法,那么不会造成影响,原因是,因为这个类,他自己本身也是有Object的默认方法的。会将这个方法继承过来。

// 左边是参数,右边是方法体,没有参数,()不能省略,下图说明,是对象而不是函数,用myInterface 引用来接收。这个特殊的对象类型,就是函数式接口
MyInterface myInterface = () -> {
            System.out.println("hello");
        };
// (p1,p2,p3) -> {
//       System.out.println("hello");
//    }

在这里插入图片描述之前的迭代都是属于外部迭代,外部迭代器去迭代。比如for循环。
与之对应的内部迭代,在集合内部进行迭代。

第二种方式:
方法引用来创建函数式接口的实例:

// :: 是对Consumer接口的一个实现
 list.forEach(System.out::println);

下图,第一种是串行流,第二种是并行流,多线程的方式效率更高一些。
在这里插入图片描述源 调用map方法,给定一个输入,返回一个输出,输入为函数式接口。
map映射,给定一个值,映射成另外一个值。也是返回stream。
在这里插入图片描述

// 两种方式
list.stream().map(item -> item.toUpperCase()).forEach(item -> System.out.println(item));
// 方法引用,根据类和方法名进行推断
list.stream().map(String::toUpperCase).forEach(item -> System.out.println(item));

T输入类型 (调用方法的对象)R输出类型(方法的返回值) result
在这里插入图片描述Function 接受一个参数,返回一个结果。
接口里可以定义默认方法也可以定义静态方法。

编写规范
在这里插入图片描述

在这里插入图片描述排序
一种是表达式 语法
一种是语句 语法
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章