Lambda表达式的学习笔记

Java Lambda语法

Lambda 表达式的基础语法:Java8中引入了一个新的操作符 “->” 该操作符称为箭头操作符或 Lambda 操作符
箭头操作符将 Lambda 表达式拆分成两部分:

  1. 无参数,无返回值
() -> System.out.println("Hello Lambda!");
  1. 有一个参数,并且无返回值
(x) -> System.out.println(x)
  1. 若只有一个参数,小括号可以省略不写
x -> System.out.println(x)
  1. 有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
Comparator<Integer> com = (x, y) -> {
	System.out.println("函数式接口");
	return Integer.compare(x, y);
};
  1. 若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
  1. Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
(Integer x, Integer y) -> Integer.compare(x, y);

Lambda 表达式需要“函数式接口”的支持

函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰
可以检查是否是函数式接口

public class Main {

  public static void main(String[] args) {
  	//方式一
    MyIntegerCalculator myIntegerCalculator = (s1) -> s1 * 2;
	//方式二
	MyIntegerCalculator myIntegerCalculator2 = (s1) -> {
		return s1 * 2;	
	};
    System.out.println(myIntegerCalculator.calcIt(5));
	System.out.println(myIntegerCalculator2.calcIt(5));
  }
}
@FunctionalInterface
interface MyIntegerCalculator {

  public Integer calcIt(Integer s1);

}

结果都是: 10
s1 : 就是说,实现接口(MyIntegerCalculator)中方法(calcIt)里面的参数(Integer s1),方法里面多少个参数,括号()里面就多少个参数
s1 * 2 :进行的操作

四大接口

Java8 内置的四大核心函数式接口

  • Consumer<T> 消费型接口
@FunctionalInterface
public interface Consumer<T> {
	 void accept(T t);
}
  • Supplier<T> 供给型接口
@FunctionalInterface
public interface Supplier<T> {
    T get();
}
  • Function<T, R> 函数型接口
@FunctionalInterface
public interface Function<T, R> {
	R apply(T t);
}
  • Predicate<T> 断言型接口

@FunctionalInterface
public interface Predicate<T> {
	boolean test(T t);
}

Java 静态方法引用

方法引用类型
有六种类型的方法引用。

TypeName::staticMethod - 引用类的静态方法,接口或枚举
objectRef::instanceMethod - 引用实例方法
ClassName::instanceMethod - 从类中引用实例方法
TypeName.super::instanceMethod - 从对象的父类型引用实例方法
ClassName::new - 引用一个类的构造函数
ArrayTypeName::new - 对指定数组类型的构造函数的引用

  • 静态方法
Function<Integer, String> func1  = (x) -> Integer.toBinaryString(x);
System.out.println(func1.apply(10));

Function<Integer,String> func2 = Integer::toBinaryString;
System.out.println(func2.apply(10) );

结果都是 : 1010

  • 实例方法

instance::MethodName

Supplier<Integer> supplier = () -> "hello world".length();
System.out.println(supplier.get());

Supplier<Integer> supplier1 = "hello world"::length;
System.out.println(supplier1.get());

运行结果:
**加粗样式**

ClassName::instanceMethod

String name = "hello world";
Function<String, Integer> strLengthFunc = (e) -> e.length();
Integer length = strLengthFunc.apply(name);
System.out.println(name + ":" + length);

String name2 = "hello lambda";
Function<String, Integer> strLengthFunc2 = String::length;
Integer length2 = strLengthFunc2.apply(name2);
System.out.println(name2 + ":" + length2);
  • 构造函数
    1). 使用构造函数引用的语法是:ClassName::new
Supplier<String> supplier = () -> new String();
System.out.println(supplier.get());


Supplier<String> supplier2 = String::new;
System.out.println(supplier2.get());


Function<String, String> function = (e) -> new String(e);
System.out.println(function.apply("hello world"));

Function<String, String> function2 = String::new;
System.out.println(function2.apply("hello world"));

运行效果:
在这里插入图片描述
2) . 数组构造函数引用 ArrayTypeName::new

IntFunction<int[]> intFunction1 = (e) -> new int[e];
int[] arr = intFunction1.apply(5);
System.out.println(arr.length);

IntFunction<int[]> intFunction2 = int[] :: new;
int[] arr2 = intFunction2.apply(10);
System.out.println(arr2.length);

运行效果:
在这里插入图片描述

  • 通用方法
    ClassName::<TypeName>methodName
    通用构造函数引用的语法:ClassName<TypeName>::new
Function<String[], List<String>> function = Arrays::<String>asList;
List<String> stringList = function.apply(new String[]{"a", "b", "c", "d", "e"});
System.out.println(stringList);

运行效果
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页