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 set=new TreeSet(new StudentComparator());

//通过lamdba表达式实现

set=new TreeSet((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=new TreeSet(new 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);

}

});

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表达式和匿名内部类的区别

推荐阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: