Java中Lambda表达式的使用详解

网友投稿 237 2022-09-24


Java中Lambda表达式的使用详解

目录理解函数式接口以及 Lambda表达式的发展过程Lambda表达式及语法一起来看看具体的使用你需要注意什么Lambda的实际运用1.对集合排序2.遍历集合3.遍历集合(带条件)4.代替 Runnable,开启一个线程

理解函数式接口以及 Lambda表达式的发展过程

任何接口,只包含唯一一个抽象方法,就是函数式接口

/**

* lambdab表达式的发展

*/

public class TestLambda1 {

//3.静态内部类

static class Like2 implements ILike{

@Override

public void lambda() {

System.out.printhttp://ln("i like lambda2");

}

}

public static void main(String[] args) {

ILike like=new Like();

like.lambda();

like=new Like2();

like.lambda();

//4.局部内部类

class Like3 implements ILike{

@Override

public void lambda() {

System.out.println("i like lambda3");

}

}

like=new Like3();

like.lambda();

//5.匿名内部类

like=new ILike() {

@Override

public void lambda() {

System.out.println("i like lambda4");

}

};

like.lambda();

//6.用lambda简化

like=()->{

System.out.println("i like lambda5");

};

like.lambda();

}

}

//1.定义一个函数式接口

interface ILike{

void lambda();

}

//2.实现类

class Like implements ILike{

@Override

public void lambda() {

System.out.println("i like lambda");

}

}

Lambda表达式及语法

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)

// 1. 不需要参数,返回值为 5

() -> 5

// 2. 接收一个参数(数字类型),返回其2倍的值

x -> 2 * x

// 3. 接受2个参数(数字),并返回他们的差值

(x, y) -> x – y

// 4. 接收2个int型整数,返回他们的和

(int x, int y) -> x + y

// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)

(String s) -> System.out.print(s)

也就是说,不需要事先声明参数的类型,圆括号可以没有,大括号可以没有,返回值可以没有

一起来看看具体的使用

public class java8_Lambda_Test {

public static final void main(String[] args) {

Operator addOper = (a, b) -> a + b;

Operator reduceOper = (a, b) -> a - b;

Operator multiplyOper = (a, b) -> a * b;

Operator DivideOper = (a, b) -> a / b;

java8_Lambda_Test test = new java8_Lambda_Test();

System.out.println(test.getResult(3, 3, addOper));//6

System.out.println(test.getResult(3, 3, reduceOper));//0

System.out.println(test.getResult(3, 3, multiplyOper));//9

System.out.println(test.getResult(3, 3, DivideOper));//1

}

public int getResult(int a, int b, Operator operator) {

return operator.convert(a, b);

}

public interface Operator {

int convert(int a, int b);

default int get(int a) {

return a;

}

}

}

你需要注意什么

1.lambda 表达式只能引用标记了 final 的外层局部变量

2.可以直接在 lambda 表达式中访问外层的局部变量

Lambda的实际运用

1.对集合排序

问题描述:在一个存放了Student对象的list中,按年龄进行排序,输出排序后的list

Student类

public class Student implements Comparable{

private String name;

private int age;

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 int compareTo(Student student2) {

int result =this.age - student2.age;

return result;

}

}

List list=new ArrayList<>();

Student s1=new Student();

s1.setName("张三");

s1.setAge(28);

list.add(s1);

Student s=new Student();

s.setName("李四");

s.setAge(22);

list.add(s);

sortUsingJava8(list);

list.forEach((student) -> System.out.println(student.getName() + ":"+student.getAge()));

// 使用 java 8 排序

static void sortUsingJava8(List list){

Collections.sort(list, (student1, student2) -> student1.compareTo(student2));

}

来康康使用Java7进行排序是这样的:

// 使用 java 7 排序

private void sortUsingJava7(List list){

Collections.sort(list, new Comparator() {

@Override

public int compare(String s1, String s2) {

return s1.compareTo(s2);

}

});

}

2.遍历集合

//先准备一个集合

List list=new ArrayList<>();

Student s1=new Student();

s1.setName("张三");

s1.setAge(28);

list.add(s1);

Student s=new Student();

s.setName("李四");

s.setAge(22);

list.add(s);

//使用 lambda 表达式以及函数操作(functional operation)

list.forEach((student) -> System.out.println(student.getName() + ":"+student.getAge()));

3.遍历集合(带条件)

//带条件 打印年龄大于等于20的学生的姓名

list.forEach((student)->{

if (student.getAge()>=20)

System.out.println(student.getName());

});

4.代替 Runnable,开启一个线程

Runnable r = new Runnable() {

@Override

public void run() {

//to do something

}

};

Thread t = new Thread(r);

t.start();

现在这样写:

Runnable r = () -> {

//to do something

};

Thread t = new Thread(r);

t.start();

你还可以这样写:

Thread t = new Thread(() -> {

//to do something

// such as for

for(int i = 0; i < 100; i++){

System.out.println(i);

}

});

t.start;


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:华为单臂路由实战(华为单臂路由器的配置过程)
下一篇:NA西游第一难:VLAN学习
相关文章

 发表评论

暂时没有评论,来抢沙发吧~