还java8感觉很新嘛?
看看jdk.java.net中已经jdk12啦,那还不赶快学,再不学真来不及了 相信大家的项目里面有很多已经用了jdk8了,但是又有多少真正使用的java8的新特性呢? 本人一边学习一边总结,希望也可以对正在学习java8的javaer有所帮助吧为什么使用lambda表达式?
我们先看一下一些代码原来的写法吧,相信大家会异常熟悉的
- 实现Runnable接口来实现多线程的写法
public class Worker implements Runnable {
@Override
public void run() {
System.out.println("实现runnable接口,实现多线程");
}
}
//实现多线程
Worker worker = new Worker();
new Thread(worker).start();
复制代码
- 实现Comparator接口来实现自定义比较器
public class LengthComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
}
String[] strings = new String[]{"tony", "a", "tom", "jack"};
Arrays.sort(strings, new LengthComparator());
复制代码
上面量个例子都是将一个实现接口的类的对象传递给一个方法调用,因为在java8之前java是不支持将代码块做为参数传递的
lambda表达式使用
还是使用上面的两个实例
- 实现多线程
//java8
new Thread(() -> {
System.out.println("lambda实现多线程");
}).start();
//只有一行简化{}
new Thread(() -> System.out.println("lambda实现多线程")).start();
复制代码
- 实现比较器
//java8
Arrays.sort(strings, (first, second) -> {
return Integer.compare(first.length(), second.length());
});
//代码中只有return语句,可简化
Arrays.sort(strings, (first, second) -> Integer.compare(first.length(), second.length()));
//参数调用其类的相同方法,再简化
Arrays.sort(strings, Comparator.comparingInt(String::length));
复制代码
和原来的写法比较,java8的写法是不是又简单又炫酷。下面简单的说一说语法吧,当时我也理解一会呢。如果你的JavaScript(ES6)写的很6,那么理解起来真的是如数家珍。
- 从上面的两个例子可以看出,lambda表达式都是用于直接实现接口的,不需要类去实现了,我们自己写一个接口试试
public interface IOneMethods {
void method();
}
void testOneMethod(IOneMethods iOneMethods){
iOneMethods.method();
System.out.println("为了使用lambda表达式");
}
//一个抽象方法的接口用lambda
new Test().testOneMethod(() -> System.out.println("使用lambda表达式实现接口"));
复制代码
这边我们看到接口里面只有一个抽象方法,如果有两个或者是多个可不可以使用lambda表达式呢,我们新建一个试一下就知道了
public interface ITwoMethods {
void firstMethod();
void secondMethod(String methodName);
}
void testTwoMethod(ITwoMethods iTwoMethods){
System.out.println("为了使用lambda表达式");
}
//两个抽象方法的接口使用lambda
new Test().testTwoMethod(() -> System.out.println("使用lambda表达式实现接口"));
new Test().testTwoMethod((name) -> System.out.println(name));
复制代码
- 代码很好看对吧,看下我的截图,我还为了区别两个抽象方向,让参数不一样,结果还是不行的,所以自己写的接口只有一个抽象方法的时候才可以使用lambda表达式
所以这边就引入一个新的概念——函数式接口
对于只包含一个抽象方法的接口,你可以使用lambda表达式来创建该接口的对象。这种接口被称为函数式接口。当你希望使用lambda表达式的时候,你必须要记住表达式的目的,并为他指定一个函数式接口。
- 我们可以为函数式接口添加@FunctionalInterface注解,编译的时候和生成接口文档的时候就会检查和声明这是一个函数式接口
@FunctionalInterface
public interface IOneMethods {
void method();
}
复制代码
方法的引用
上面我们看到这样一个符号 :: 实际上面这对对象方法的引用
//方法引用::
List<String> stringList = Arrays.asList(strings);
// List<Integer> stringLength = stringList.stream().map(string -> string.length()).collect(Collectors.toList());
List<Integer> stringLength = stringList.stream().map(String::length).collect(Collectors.toList());
复制代码
- 这边里面有一些steam的东西后面我会讲的,我们就看map里面的 string -> string.length() length()方法是String类中的,所以我们在lambda中可以用 类名::方法 去实现,包括一个new对象的操作 Preson::new
以上属于自学总结,如有有说的有问题的方法欢迎指出
- https://github.com/Radicalpro/LearningJDK8