Lambda表达式简介
在Java中,Lambda表达式是一种函数式接口的实例,它可以作为参数传递给方法或存储在变量中。Lambda表达式允许以一种简洁的方式定义匿名函数,使得在Java中使用函数式编程更加方便。 Lambda表达式的定义遵循以下语法形式:
parameter -> expression
(parameter1, parameter2) -> expression
(parameter1, parameter2) -> { code block }
例子
public class lambda_demo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.forEach((n) -> {
System.out.println(n);
});
}
}
使用lambda筛选(Filter)
public class filter_demo {
public static void main(String[] args) {
List<String> names = Arrays.asList("万里", "千里", "伍六一");
List<String> longName = names.stream().filter(n -> n.length() >= 3).collect(Collectors.toList());
for (String s: longName) {
System.out.println(s);
}
}
}
// 伍六一
使用lambda映射(Map)
public class filter_demo {
public static void main(String[] args) {
List<String> names = Arrays.asList("zhangsan", "lisi", "wangwu");
List<String> upperCaseNames = names.stream().map(n -> n.toUpperCase()).collect(Collectors.toList());
for (String s: upperCaseNames) {
System.out.println(s);
}
}
}
使用lambda排序(Sort)
public class filter_demo {
public static void main(String[] args) {
List<String> nums = Arrays.asList("1", "2", "3");
List<String> sortedNums = nums.stream().sorted((n1, n2) -> n2.compareTo(n1)).collect(Collectors.toList());
for (String s: sortedNums) {
System.out.println(s);
}
}
}
// 3
// 2
// 1
使用Consumer存储变量
使用 Java Consumer 的接口将 lambda 表达式存储在变量中:
public class lambda_demo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Consumer<Integer> method = (n) -> {
System.out.println(n);
};
list.forEach(method);
}
}
创建一个将 lambda 表达式作为参数的方法:
interface StringFun{
String run(String str);
}
public class lambda_demo {
public static void printFormatted(String str, StringFun formate) {
String result = formate.run(str);
System.out.println(result);
}
public static void main(String[] args) {
StringFun exclaim = s -> s + "!";
StringFun ask = x -> x + '?';
printFormatted("hello", exclaim);
printFormatted("hello", ask);
}
}
使用操作符::分割方法名和类或对象
函数引用:引用⼀个已经存在的方法,使其替代lambda表达式完成接口的实现。
interface TestI{
int test(int a,int b);
}
public class filter_demo {
public static void main(String[] args) {
TestI test1 = Calculator::calculate;
System.out.println(test1.test(4,5));
}
}
class Calculator{
public static int calculate(int a,int b ){
if (a > b) {
return a - b;
}
return b - a;
}
}