还java8感受很新嘛? java
咱们先看一下一些代码原来的写法吧,相信你们会异常熟悉的git
public class Worker implements Runnable {
@Override
public void run() {
System.out.println("实现runnable接口,实现多线程");
}
}
//实现多线程
Worker worker = new Worker();
new Thread(worker).start();
复制代码
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是不支持将代码块作为参数传递的github
仍是使用上面的两个实例多线程
//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,那么理解起来真的是如数家珍。ide
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表达式的时候,你必需要记住表达式的目的,并为他指定一个函数式接口。学习
@FunctionalInterface
public interface IOneMethods {
void method();
}
复制代码
上面咱们看到这样一个符号 :: 实际上面这对对象方法的引用spa
//方法引用::
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());
复制代码