什么是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 接受一个参数,返回一个结果。
接口里可以定义默认方法也可以定义静态方法。
编写规范
排序
一种是表达式 语法
一种是语句 语法