文章目录
- Lamda表达式
- 简介:
- 百科介绍:
- 为什么要使用lambda表达式:
- 语法
- 实用展示
- 工具类:
- 基础用法:
- 排序中使用:
- 给字符串数组按长度大小排序:
Lamda表达式
简介:
百科介绍:
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。其实质属于函数式编程的概念.
Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。下面这个例子就是使用Lambda语法来代替匿名的内部类,代码不仅简洁,而且还可读。
为什么要使用lambda表达式:
1、避免匿名内部类定义过多
2、可以让你的代码看起来很简洁
3、去掉了一堆没有意义的代码,只留下核心的逻辑。
也许你会说,我看了Lambda表达式,不但不觉得简洁,反而觉得更乱,看不懂了。那是因为我们还没有习惯,用的多
了,看习惯了,就好了。
语法
lambda 表达式的语法格式如下:
(parameters) -> expression
或 (parameters) ->{ statements; }
以下是lambda表达式的重要特征:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
实用展示
工具类:
package Lambda;
public class Dog {
String name;
int age;
Dog(){
System.out.println("调用无参构造");
}
Dog(String name,int age){
this.name=name;
this.age=age;
System.out.println("调用了有参构造");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
基础用法:
package Lambda;
public class Lam {
public static void main(String[] args) {
// 方法引用
infa1 fl= Integer::sum;
// 省略大括号
infa1 fl1 =(int a,int b)->a+b;
// 最全面写法
infa1 fl2 =(int a,int b)->{
int c=a*b;
return c+a;
};
// 省略参数类型
infa1 fl3=(a,b)->a-b;
// 单个参数省略小括号
infa2 fal=c -> c*c;
// 无参保留小括号
infal3 fal3=()-> System.out.println("hello");
// 调用对象,方法引用
Lam c=new Lam();
infa2 fa2=c::testA;
// 构造方法引用
Dogget dog1 = Dog::new;
Dogget1 dog4=Dog::new;
// 结果同上,方式不同
Dogget dog2 =()->new Dog();
Dogget dog3 = ()->new Dog("小狗",2);
System.out.println(fl.sum(3, 5));
System.out.println(fl1.sum(3,9));
System.out.println(fl2.sum(2, 4));
System.out.println(fl3.sum(2, 4));
System.out.println(fal.d(5));
fal3.hello();
System.out.println(fa2.d(10));
System.out.println(dog1.getdog().toString());
System.out.println(dog2.getdog().toString());
System.out.println(dog3.getdog().toString());
System.out.println(dog4.getdog("小狗", 3).toString());
}
public int testA(int a){
return a-2;
}
interface infa1{
int sum(int a,int b);
}
interface infa2{
int d(int c);
}
interface infal3{
void hello();
}
// 构造方法调用
interface Dogget{
Dog getdog();
}
interface Dogget1{
Dog getdog(String name,int age);
}
}
运行结果:
8
12
10
-2
25
hello
8
调用无参构造
Dog{name='null', age=0}
调用无参构造
Dog{name='null', age=0}
调用了有参构造
Dog{name='小狗', age=2}
调用了有参构造
Dog{name='小狗', age=3}
进程已结束,退出代码0
排序中使用:
package Lambda;
import java.util.ArrayList;
import java.util.Comparator;
public class Lam2 {
public static void main(String[] args) {
Lam2 L=new Lam2();
ArrayList<Dog> list=new ArrayList<>();
list.add(new Dog("f",1));
list.add(new Dog("e",2));
list.add(new Dog("d",3));
list.add(new Dog("c",4));
list.add(new Dog("b",5));
list.add(new Dog("a",6));
// 年龄大小排序
list.sort((o1,o2)->o1.getAge()-o2.getAge());
System.out.println(list);
// 名字首字母排序
list.sort(((o1, o2) -> o1.getName().charAt(0)-o2.getName().charAt(0)));
// list.sort((Comparator.comparingInt(o -> o.getName().charAt(0))));
System.out.println(list);
// Comparator接口
list.sort(Comparator.comparingInt(Dog::getAge));
System.out.println(list);
// forEach方法的使用
System.out.println("forEach方法打印");
// 使用方法引用
list.forEach(System.out::println);
System.out.println("forEach方法打印");
list.forEach(L::dogString);
}
public void dogString(Dog g) {
System.out.print("Dog{" +
"name='" + g.getName() + '\'' +
", age=" + g.getAge() +
'}');
System.out.println(" 类内方法");
}
}
运行结果:
[Dog{name='f', age=1}, Dog{name='e', age=2}, Dog{name='d', age=3}, Dog{name='c', age=4}, Dog{name='b', age=5}, Dog{name='a', age=6}]
[Dog{name='a', age=6}, Dog{name='b', age=5}, Dog{name='c', age=4}, Dog{name='d', age=3}, Dog{name='e', age=2}, Dog{name='f', age=1}]
[Dog{name='f', age=1}, Dog{name='e', age=2}, Dog{name='d', age=3}, Dog{name='c', age=4}, Dog{name='b', age=5}, Dog{name='a', age=6}]
forEach方法打印
Dog{name='f', age=1}
Dog{name='e', age=2}
Dog{name='d', age=3}
Dog{name='c', age=4}
Dog{name='b', age=5}
Dog{name='a', age=6}
forEach方法打印
Dog{name='f', age=1} 类内方法
Dog{name='e', age=2} 类内方法
Dog{name='d', age=3} 类内方法
Dog{name='c', age=4} 类内方法
Dog{name='b', age=5} 类内方法
Dog{name='a', age=6} 类内方法
进程已结束,退出代码0
给字符串数组按长度大小排序:
package Lambda;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
/*
* 字符串数组按长度大小排序
* */
public class Soulution {
public static void main(String[] args) {
String[] arr={"a","ab","c","abc" };
sortByLength(arr);
}
public static void sortByLength(String[] strArr) {
ArrayList<String> list = new ArrayList<>(Arrays.asList(strArr));
list.sort((Comparator.comparingInt(String::length)));
list.forEach(System.out::println);
// 一行解决
// Arrays.stream(strArr).sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);
}
}
运行结果:
a
c
ab
abc
进程已结束,退出代码0