目录
简单记录一下java8有哪些新特性,这个是去年年末到短信子弹头面试的时候被问到过的,当时不会回答,这也算是一个考点。
java8引入了哪些新特性
1.Lamada表达式
2.接口默认方法和静态方法
3.引入了流Stream
4.可以重复注解
5.对方法的引用使用了::
6.支持并行(parallel)数组
7.使用Base64
1.Lamada表达式
lamada表达式用于替代匿名类的使用,这种匿名类一定要是那种实现接口对接口方法重新,这种接口只有一个方法的这种,这种接口也被称为函数接口,一般用()->{} 来代替匿名内部类。
public class LamadaStudy {
@Test
public void testLamada(){
//普通写法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("普通写法-------开启java8新特性的学习");
}
}).start();
//lamada写法,带有打括号的
new Thread(()->{
System.out.println("lamada写法-------开启java8新特性的学习");
}).start();
//不带多括号的
new Thread(()->
System.out.println("去掉打括号-------开启java8新特性的学习") //打括号只有一行代码的时候去掉大括号
).start();
//带有返回值的普通写法
Integer[] intArr = {2,5,3,1,6,4,8};
List<Integer> list = Arrays.asList(intArr);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println("带有返回值的普通写法---------"+list.toString());
//带扣返回值的lamada写法
Collections.sort(list,(int1,int2)->{return int1-int2;});
System.out.println("带带扣返回值的lamada写法---------"+list.toString());
//自己写一个函数接口 普通写法
String meassage = LamadaStudy.goodgoodStudy("今天星期日,加油",new ISundayStudy(){
@Override
public String lamadaStudy(String message){
return message;
}
});
System.out.println("字节手写普通的函数接口--------"+meassage);
//lamada写法
String messageTwo = LamadaStudy.goodgoodStudy("今天将java8的新特性学完",(message)->{
return "加油"+message;
});
System.out.println("字节手写lamada表达式接口--------"+messageTwo);
}
}
@FunctionalInterface
interface ISundayStudy{
String lamadaStudy(String message);
}
2.接口默认方法和静态方法
interface IDefaultFunction{
default void study(){
System.out.println("什么时候能找到工作");
}
static void finJob(){
System.out.println("开始找工作");
}
}
class DefaultFunction implements IDefaultFunction{
}
Java 8用默认方法与静态方法这两个新概念来扩展接口的声明。默认方法与抽象方法不同之处在于抽象方法必须要求实现,但是默认方法则没有这个要求,就是接口可以有实现方法,而且不需要实现类去实现其方法。我们只需在方法名前面加个default关键字即可实现默认方法。为什么要有这个特性?以前当需要修改接口的时候,需要修改全部实现该接口的类。而引进的默认方法的目的是为了解决接口的修改与现有的实现不兼容的问题。
3.引入了流Stream
Stream可以链式书写代码,需要几行搞定的代码,Stream可以一行搞定,Stream是使用内部迭代,而且Stream支持并行操作
@Test
public void streamTest(){
List<Integer>list = new ArrayList<>();
list.add(2);
list.add(4);
list.add(5);
list.forEach(integer -> {
System.out.println(integer);
});
System.out.println("=======分割线=========");
List<Integer> list2 = list.stream().filter((i)-> i>2).collect(Collectors.toList());
list2.forEach(i-> System.out.println(i));
}
输出
2
4
5
=======分割线=========
4
5
filter:接受lamada表达式,从中截取一符合条件的元素
limit:截流limit(5),表示截取五个元素
skip(n):跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n个,则返回一个空流,与limit(n)互补
distinct:筛选,通过流所生成元素的hashCode()和equals()去除重复元素
map--接收Lambda,将元素转换成其他形式或提取信息
4.可以重复注解
@Repeatable注解
5.集合引入了很多parallel开头的并行操作的方法
特别是parallelSort,这个将排序拆分很多小的集合,运用多线程进行排序,最后合并,得到最终想要的结果。
参考文:
https://www.cnblogs.com/wuhenzhidu/p/10740091.html
https://blog.csdn.net/javazyw/article/details/82733459
https://blog.csdn.net/ZytheMoon/article/details/89715618
今天星期日在宿舍坐了一天,只有吃饭的时候才出去了一下,虽然现在周末和工作日对我来说没区别,但是对我以前是有区别的,想想当初有工作的时候,周末是怎么过的,现在的周末是怎么过的,当初工作也不是很忙,周末大把的时间,当极少拿来学习的,我想到了其中有很大一部分程序员他们平时周末就应该像我这样过的,我现在只是在追赶他们罢了,不是本来就知道的少,而是平时没有花时间去学,其实一个小的知识点花一天时间来学习就已经足够了,但是浪费了太多的光阴。
只能告诉自己:悟以往之不谏 知来者之可追