-
JDK1.8新特性(stream、lambda表达式、接口default方法)
答:Java8(又称JKD1.8)是Java语言开发的一个主要版本。Oracle 公司于2014年3月18日发布 Java 8 。
企业开发一般选择的是最稳定的版本而不是最新的,所以JDK1.8目前在企业中应用的非常多,问到这类问题也就不奇怪了!
新增特性:
(1)支持Lambda表达式
(2)函数式接口
(3)新的Stream API
(4)新的日期
(5)API其他特性
下面进行详细介绍:(1)支持Lambda表达式
Lambda引入了新的操作符:->(箭头操作符),->将表达式分成两部分。左侧:(参数1,参数2-…)表示参数列表。右侧:0内部是方法体。
注意事项:
- 形参列表的数据类型会自动推断。如果形参列表为空,只需保留()。
- 如果形参只有1个,()可以省略,只需要参数的名称即可。
- 如果执行语句只有一句,且无返回值,}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有一句。
- Lambda不会生成一个单独的内部类文件
例子1:线程创建的Lambda表达式使用
/**
* Lambda表达式的使用
* 例子1:线程的创建
*/
public class Demo1 {
public static void main(String[] args) {
//匿名内部类的方式
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("子线程1执行了~");
}
};
//Lambda表达式
Runnable runnable1 = ()->{
System.out.println("子线程2执行了~");
};
//如果执行的只有一条语句,那么大括号也能够省略
Runnable runnable2 = ()-> System.out.println("子线程3执行了~");
new Thread(runnable).start();
new Thread(runnable1).start();
new Thread(runnable2).start();
//Lambda表达式同时也可以作为参数进行传递
new Thread(()-> System.out.println("子线程3执行了~")).start();
}
}
例子2:比较器的Lambda表达式使用
import java.util.Comparator;
import java.util.TreeSet;
/**
* Lambda表达式的使用
* 例子2:比较器的使用
*/
public class Demo2 {
public static void main(String[] args) {
//匿名内部类
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
};
//Lambda表达式
Comparator<String> comparator1 = (String o1, String o2)-> {
return o1.length()-o2.length();
};
//再次简化,已经知道是String类型了,那么传进去的参数类型也可以省略
Comparator<String> comparator2 = ( o1, o2)-> {
return o1.length()-o2.length();
};
//只有一条语句,可以省略大括号,同时return也要省略
Comparator<String> comparator3 = (o1, o2)-> o1.length()-o2.length();
TreeSet<String> treeSet = new TreeSet<>(comparator);
}
}
方法引用
方法引用是Lambda表达式的一种简写形式。如果Lambda表达式方法体中只是调用一个特定的已经存在的方法,则可以使用方法引用。
常见形式
1)对象::实例方法
2)类::静态方法
3)类::实例方法
4)类::new
import java.util.Comparator;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
public class Demo3 {
public static void main(String[] args) {
//1.对象::实例方法,因为println函数是有输入无输出,和Consumer的形式相同。
Consumer<String> consumer = s-> System.out.println(s);
consumer.accept("Hello");
Consumer<String> consumer1 = System.out::println;
consumer1.accept("world");
//2.类::静态方法。
Comparator<Integer> comparator