1 概念
1.8的新特性目的:简化代码的书写简单理解:一个匿名函数
Lambda表达式是Java SE 8中一个重要的新特性。
lambda表达式允许你通过表达式来代替功能接口。
lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。
由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。
Lambda表达式还增强了集合库。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。函数式编程 。scala
使用 Lambda 表达式可以使代码变的更加简洁紧凑 ,可读性差
2 案例1
lambda主要功能:简化实现接口的代码
注意:lambda只适用于:只有一个方法需要被实现的接口
package com.zhiyou10.test01;
public class Test01 {
public static void main(String[] args) {
//方法1:创建实现类对象
MyInter1 m1=new MyClass1();
System.out.println(m1.add(1,2));
//方法2:创建匿名内部类
MyInter1 m2=new MyInter1(){
public int add(int a,int b){
System.out.println("方法2:创建匿名内部类!!!!");
return a+b;
}
};
//方式3:接口中只有一个方法需要实现:
MyInter1 m3=(int c,int b)-> {
//System.out.println("方式3:接口中只有一个方法需要实现");
return c+b;
};
m3=(c, b)-> c+b;//(c,b)是方法声明 c+b是方法的返回值
//m3.add(1,3);
m3=(int c, int b)-> c+b;//(int c, int b)是方法声明 类型可以省略
m3=(int c, int b)->{return c+b;};//(int c, int b)是方法声明 return 必须加{}
}
}
//只适用于只有一个方法的接口
interface MyInter1{
int add(int a,int b);
}
//做法1:创建实现类对象
class MyClass1 implements MyInter1{
public int add(int a,int b){
System.out.println("做法1:创建实现类对象----");
return a+b;
}
}
3 lambda表达式的注意事项
public class Test02 {
int a=1;//成员变量a
static int b=1;//类变量b
public static void main(String[] args) {
new Test02().method01();
}
int aa=-1;
public void method01(){
int c=3;//局部变量
//c++; //报错
a++;
b++;
MyInterface2 m1=(int aa) -> {
a++;
b++;
//c++; //报错
System.out.println("hehe参数aa="+aa);
System.out.println("成员变量 a="+a);
System.out.println("静态成员变量 b="+b);//lamdba表达式使用的类变量和实力变量值可以更改
System.out.println("局部变量 c="+c);//lamdba表达式使用的方法的局部变量 值不能更改 最好是fianl
System.out.println("成员变量aa="+this.aa);//lamdba表达式的参数列表可以给成员变量重名:通过this.调用成员变量
};
a++;
b++;
//c++; //报错
m1.hehe(222);
}
}
interface MyInterface2{
void hehe(int a);
}
4 练习
练习1:通过lambda实现多线程
package com.zhiyou10.test01;
public class Test03 {
public static void main(String[] args) {
//1练习1:通过lambda表达式来实现多线程:
//runnable接口中只有一个抽象方法 可以使用lambda表达式
//打印数字:使用lambda表达式
new Thread(()->{
for(int i=1;i<=50;i++){
try {Thread.sleep(100); }catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"::::"+i+"----"+(int)(Math.random()*10));
}
},"打印数字的线程").start();
//打印字母:使用传统方式1
new Thread(new PrintABC(),"打印小写字母的xiancheng").start();
//打印字母:使用传统方式2
new Thread(new Runnable() {
public void run() {
for(int i=1;i<=50;i++){
try {Thread.sleep(100); }catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"::::"+i+"____"+(char)(Math.random()*26+'A'));
}
}
}, "打印大写字母的xiancheng").start();
}
}
class PrintABC implements Runnable{
public void run(){
for(int i=1;i<=50;i++){
try {Thread.sleep(100); }catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"::::"+i+"____"+(char)(Math.random()*26+'a'));
}
}
}
练习2:通过lambda实现比较器
package com.zhiyou10.test01;
import java.util.Comparator;
import java.util.TreeSet;
public class Test04 {
public static void main(String[] args) {
//通过实现类对象实现
TreeSet
//通过lamdba表达式实现
set=new TreeSet
//要求:先按分数表:分数高的大
// 再按年龄比较:年龄小的大
// 再按名字比较:
if(o1.score!=o2.score){
return o1.score>o2.score?1:-1;
}
if(o1.age!=o2.age){
return o2.age-o1.age;
}
return o1.name.compareTo(o2.name);
});
//通过匿名内部类实现
set=new TreeSet
@Override
public int compare(Student o1, Student o2) {
//要求:先按分数表:分数高的大
// 再按年龄比较:年龄小的大
// 再按名字比较:
if(o1.score!=o2.score){
return o1.score>o2.score?1:-1;
}
if(o1.age!=o2.age){
return o2.age-o1.age;
}
return o1.name.compareTo(o2.name);
}
});
set.add(new Student((int)(Math.random()*5+20),"张三"+(int)(Math.random()*3),(float)(Math.random()*100.0)));
set.add(new Student((int)(Math.random()*5+20),"张三"+(int)(Math.random()*3),(float)(Math.random()*100.0)));
set.add(new Student((int)(Math.random()*5+20),"张三"+(int)(Math.random()*3),(float)(Math.random()*100.0)));
set.add(new Student((int)(Math.random()*5+20),"张三"+(int)(Math.random()*3),(float)(Math.random()*100.0)));
set.add(new Student((int)(Math.random()*5+20),"张三"+(int)(Math.random()*3),(float)(Math.random()*100.0)));
set.add(new Student((int)(Math.random()*5+20),"张三"+(int)(Math.random()*3),(float)(Math.random()*100.0)));
set.add(new Student((int)(Math.random()*5+20),"张三"+(int)(Math.random()*3),(float)(Math.random()*100.0)));
set.add(new Student((int)(Math.random()*5+20),"张三"+(int)(Math.random()*3),(float)(Math.random()*100.0)));
set.add(new Student((int)(Math.random()*5+20),"张三"+(int)(Math.random()*3),(float)(Math.random()*100.0)));
set.add(new Student((int)(Math.random()*5+20),"张三"+(int)(Math.random()*3),(float)(Math.random()*100.0)));
}
}
//让类具有可比较性:方式1:实现Comparable接口 实现compareTo(Object o)拿当前对象和参数对象比较
//让类具有可比较性:方式2:为当前类写一个比较器类:实现Comparator接口 实现public int compare(Object o1, Object o2)方法
class Student{
int age;
String name;
float score;
public Student(int age, String name, float score) {
this.age = age;
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", score=" + score +
'}';
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
}
class StudentComparator implements Comparator
@Override
public int compare(Student o1, Student o2) {
//要求:先按分数表:分数高的大
// 再按年龄比较:年龄小的大
// 再按名字比较:
if(o1.score!=o2.score){
return o1.score>o2.score?1:-1;
}
if(o1.age!=o2.age){
return o2.age-o1.age;
}
return o1.name.compareTo(o2.name);
}
}
5 注意事项
lamdba表达式和匿名内部类的区别
推荐阅读
发表评论