昨天聊完Lambad表达式之后,大家可以参考下面的各种使用场景,巩固一下知识。
上篇文章:Java 8 新特性|Lambda表达式。
在 Runnable 中使用 lambda 表达式
在 Java 8 之前,在 lambda 表达式出现前,要实现 Runnable 线程,我们需要定义一个实现 Runnable 接口的类来获取 Runnable 对象。
代码语言:javascript复制package com.sjh.test.java8;
public class LambdaRunnableDemo {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("你好,二哥!");
}
};
Thread thread = new Thread(r);
thread.run();
}
}
在看下使用 lambda 表达式实现相同的对象。
代码语言:javascript复制package com.sjh.test.java8;
public class LambdaRunnableDemo {
public static void main(String[] args) {
Runnable r = () -> System.out.println("你好,二哥!我是Lambda。");
Thread thread = new Thread(r);
thread.run();
}
}
没有对比,就没有伤害,使用 lambda 表达式真的是简单明了,代码又少。
在用户自定义的函数接口中使用 lambda 表达式
在下面这个范例中,我们将创建自己的函数接口,我们先用普通的方式来实现一下
代码语言:javascript复制package com.sjh.test.java8;
public class LambdaCustomDemo {
public static void main(String args[])
{
Calculator cal = new Calculator() {
@Override
public int add(int n1, int n2 ) {
return n1 n2;
}
};
System.out.println(cal.add(5,8));
}
public interface Calculator {
public int add(int n1, int n2);
}
}
运行结果:
代码语言:javascript复制/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.LambdaCustomDemo
13
Process finished with exit code 0
匿名内部类实现已经很简洁了。但,如果你看了 lambda 的实现,就会发现,匿名内部类还是有点复杂的。
代码语言:javascript复制package com.sjh.test.java8;
public class LambdaCustomDemo {
public static void main(String args[])
{
Calculator cal = (n1,n2) -> n1 n2;
System.out.println(cal.add(5,8));
}
public interface Calculator {
public int add(int n1, int n2);
}
}
运行结果:
代码语言:javascript复制/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.LambdaCustomDemo
13
Process finished with exit code 0
代码少的有点不像话了…
在 Comparator
中使用 lambda 表达式
现在,我们来看看 Comparator
接口,了解下如何使用 lambda 表达式对包含字符串的集合进行排序。
package com.sjh.test.java8;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class LambdaComparatorDemo {
public static void main(String[] args)
{
List<String> list = Arrays.asList("Redis","Shuffer","Kafla");
System.out.println("...排序之前...");
for(String s : list){
System.out.println(s);
}
//定义一个 comparator
Comparator<String> comp= (String s1, String s2) -> s1.compareTo(s2);
Collections.sort(list, comp);
System.out.println("...排序之后...");
for(String s : list){
System.out.println(s);
}
}
}
运行结果:
代码语言:javascript复制/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.LambdaComparatorDemo
...排序之前...
Redis
Shuffer
Kafla
...排序之后...
Kafla
Redis
Shuffer
Process finished with exit code 0
使用 Lambda 表达式实现函数接口来迭代集合
Java 8 中引入了 java.util.function
包。这个包提供了 java.util.function.Function 接口,我们可以在这个接口的帮助下,使用 Lambda 表达式来迭代集合。
java.util.function.Function 只有一个方法 apply() ,这个方法可以在用户定义的函数中调用。我们可以使用 Function 接口实现一个自定义的打印方法
代码语言:javascript复制public String customShow( Function<String,String> fun) {
return fun.apply(this);
}
然后,我们就可以使用 Lambda 来实现这个接口了
代码语言:javascript复制package com.sjh.test.java8;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
public class LambdaFunctionDemo {
public static void main(String[] args)
{
LambdaFunctionDemo tester = new LambdaFunctionDemo();
tester.run();
}
public void run()
{
List<Student> list = new ArrayList<Student>();
list.add(new LambdaFunctionDemo.Student("Redis",20));
list.add(new LambdaFunctionDemo.Student("Shuffer",22));
list.add(new LambdaFunctionDemo.Student("Kafla",18));
for(Student st: list){
System.out.println(st.customShow(s->s.getName() ": " s.getAge()));
}
}
public class Student
{
private String name;
private int age;
public Student(String name,int age){
this.name = name;
this.age = 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;
}
public String customShow(Function<Student,String> fun){
return fun.apply(this);
}
}
}
运行结果:
代码语言:javascript复制/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/... com.sjh.test.java8.LambdaFunctionDemo
Redis: 20
Shuffer: 22
Kafla: 18
Process finished with exit code 0
end