目录
5.Lambda 体中只有一条语句, return 和 大括号都可以省略不写
一、lambda表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
Java8中引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符箭头操作符将 Lambda 表达式拆分成两部分:
- 左侧:Lambda 表达式的参数列表
- 右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体
代码如下(示例):
() -> System.out.println("Hello Lambda!");
代码如下(示例):
(x) -> System.out.println(x)
3.一个参数,小括号可以省略不写
代码如下(示例):
x -> System.out.println(x)
4.二个以上参数,有返回值,并且lambda体有多条语句
代码如下(示例):
Comparator<Integer> com = (x, y) -> {
System.out.println("函数式接口");
return Integer.compare(x, y);
};
5.Lambda 体中只有一条语句, return 和 大括号都可以省略不写
代码如下(示例):
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
6.Lambda 表达式的参数列表的数据类型可以省略不写
因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
代码如下(示例):
(Integer x, Integer y) -> Integer.compare(x, y);
三、函数式接口
JDK8提供了大量常用的函数式接口以丰富Lambda的典型使用场景,主要在 java.util.function 包中。
1.消费型接口
java.util.function.Consumer<T> 接口与Supplier正好相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型参数决定。Consumer 接口中包含抽象方法 void accept(T t) ,意为消费一个指定泛型的数据。
public class ConsumerDemo {
private static void consumeString(Consumer<String> function , String str) {
function.accept(str);
}
public static void main(String[] args) {
printString(s ‐> System.out.println(s), "Xiyou");
}
}
2.供给型接口
java.util.function.Supplier<T> 接口,它意味着"供给" , 对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。Supplier仅包含一个无参的方法: T get() 。用来获取一个泛型参数指定类型的对象数据。
public class SupplierDemo {
//求数组元素最大值
public static void main(String[] args) {
int[] array = { 10, 20, 100, 30, 40, 50 };
printMax(() ‐> {
int max = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
return max;
});
}
private static void printMax(Supplier<Integer> supplier) {
int max = supplier.get();
System.out.println(max);
}
}
3.函数型接口
java.util.function.Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。有进有出,所以称为“函数Function”。Function 接口中最主要的抽象方法为: R apply(T t) ,根据类型T的参数获取类型R的结果。
public class FunctionDemo {
private static void method(Function<String, Integer> function, Str str) {
int num = function.apply(str);
System.out.println(num + 20);
}
public static void main(String[] args) {
method(s ‐> Integer.parseInt(s) , "10");
}
}
4.断言型接口
有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使用java.util.function.Predicate<T> 接口。Predicate 接口中包含一个抽象方法: boolean test(T t),用于条件判断的场景。
public class PredicateDemo {
private static void method(Predicate<String> predicate,String str) {
boolean veryLong = predicate.test(str);
System.out.println("这个字符串长么:" + veryLong);
}
public static void main(String[] args) {
method(s ‐> s.length() > 5, "HelloWorld");
}
}
四、方法的引用
1.类名::引用静态方法
Lambda表达式: n -> Math.abs(n)
方法引用: Math::abs
2.对象名::引用成员方法
String str = "hello";
printStr(str::toUpperCase);
3.类::构造引用
Lambda表达式: wuqi -> new SunWukong(wuqi)
方法引用: SunWukong::new
4.数组::构造引用
Lambda表达式: length -> new int[length]
方法引用: int[]::new
五、Stream流