JDK已经出到17了,但你迭代你的版本,我用我的8.
JDK1.8的一些新特性,当然现在也不新了,其实工作中已经很常用了。
JDK1.8都有那些新特性?
JDK1.8新增了不少新的特性,如Lambda表达式,接口默认方法,Stream API,日期时间API,Optional类等。
JDK1.8新特性
接口默认方法
Lambda表达式&函数式接口
StreamAPI
新日期时间API
OPtional类
Java8运行在接口中添加默认方法和静态方法
public interface MyInterface{
default void myDefaultMethod(){
System.out.println("My default method");
}
static void myStaticMethod(){
System.out.println("My static method");
}
}
Lambda表达式描述了一个代码块(或者加匿名方法),可以将其作为参数传递给构造方法或者普通方法以便后续执行。
public class LamadaTest{
public static void main(String[] args){
new Thread(() ->System.out.println("沉默玩儿“))。start();
}
}
《Effective Java》的作者Josh Bloch建议使用Lambda表达式,最好不要超过3行。
否则代码可读性会变得很差。
Stream是对Java集合框架的增强,它提供了一种高效且易于使用的数据处理方式
List<String> list = new ArrayList<>();
list.add("中国加油”);
list.add("世界加油”);
list.add("世界加油”);
Long count = list.stream().distinct().count()
System.out.println(count);
Java8引入了一个全新的日期和时间API,位于java,time包中。
这个新的API纠正了旧版java.util.Date类中的许多缺陷。
LocalDate today = LocalDate.now();
System.out.println("Local time:" +time);
LocalDateTime now = LocalDateTime,now();
System.out.println("Current DateTime:"+now);
引入Optional是为了减少空指针异常
Optional<String> optional = Optional.of("沉默王二);
optional.isPresent();//true
optional.get();//“沉默王二”
optional.orElase("沉默王二");//"bam"
optional.ifPresent((s)->System.out.println(s.charAt(0)));//‘沉’
Lambda表达式了解多少?
Lambda表达式主要用于提供一种简洁法方式来表示匿名方法,使得Java具备了1函数式编程的特性
比如说我们可以使用Lambda表达式来简化线程的创建:
new Thread(() ->System.out.ptintln("Hello World")).start();
这比以前的匿名内部类要简结的多
所谓的函数式编程,就是把函数作为参数传递给方法,或者作为方法的结果返回。
比如说我们可以配合Stream流进行数据过滤
List<Integer> numbers =Array.asList(1,2,3,4,5,6);
List<Integer> evenNumber =numbers.stream()
.filter(n-> n%2 ==0);
.collect(Collectors.toList());
其中n ->n%2==0就是一个Lambda表达式。表示传入一个参数n,返回n%2==0的结果。
Java8有那些内置函数式接口?
JDK1.8 API包含了很多内置的函数式接口。
其中就包括我们在老版本中经常见到的Compatator和Runnable,Java8为他们都添加了@Functionallnterface注解,以用来支持Lambda表达式。
除了这两个之外,还有Callable,Predicate,Function,Supplier,Consumer等等
Optional了解吗?
Optional是用于防范NullPointerException
可以将Optional看做是包装对象(可能是null,也有可能非null)的容器。
当我们定义一个方法,这个方法返回的对象可能是空,也有可能非空的时候,我们就可以考虑用Optional来包装它,这也是在Java8被推荐使用的做法。
Optional<String> optional =Optional.of("bam");
optional.isPresent(); //true
optional.get(); //"bam"
optional.orElse("fallback"); //"bam"
optional.ifPresent((s)->System.out.println(s.charAt(0));//"b"
Stream流用过吗?
Stream流,简单来说,使用java,util,Stream对一个包含一个或多个元素的计划做各种操作。
这些操作可能是中间操作亦或是终端操作。
终端操作会返回一个结果,而中间操作会发回一个Stream流。
Stream流一般用于集合,我们对一个集合做几个常见操作:
List<String> stringCollection = new ArrayList();
stringCollection.add("add");
stringCollection.add("aaa2");
stringCollection.add("bbb1");
stringCollection.add("aaa1");
stringCollection.add("bbb3");
stringCollection.add("ccc");
stringCollection.add("bbb2");
stringCollection.add("ddd1");
Filyer过滤
stringCollection
.stream()
.filter((s)->s.startsWith(“a”))
.forEach(System.out::ptintln)
//"aaa2","aaa1"
Sorted排序
stringCollection
.stream()
.sorted()
.filter((s)->s.startsWith("a");
.forEach(System.out::println);
//"aaa1","aaa2"
Map转换
stringCollection
.stream()
.map(String::toUpperCase)
.sorted((a,b)->b.compareTo(a))
.forEach(System.out::println);
//"DDD2","DDD1","CCC","BBB3","BBB2","AAA2”,“AAA1”
Match匹配
//验证list中string是否有以a开头的,匹配到第一个,即返回true
boolean anyStartsWithA=
stringCollection
.stream()
.anyMatch((s)->s.startsWith("a"));
System.out.println(anyStartsWithA); //true
//验证list中string是否都是a开头的
boolean allStartsWithA=
stringCollection
.stream()
.allMatch((s)->s.startsWith(“a”));
System.out.println(allStartWithA); //false
//验证list中string是否都不是以z开头的,
booleanv nonStartsWithZ =
stringCollection
.stream()
.noneMatch((s)->s.startWith("z"));
System.out.println(noneStartsWithZ); //true
Count计数
count是一个终端操作,它能够统计stream流中的元素总数,返回值是long类型
//先对list中字符串开头为b进行过滤,让后统计数量
long startsWithB =
stringCollection
.stream()
.filter((s) -> s.startsWith("b"));
.count();
System.out.println(startsWithB); //3
Reduce
Reduce中文翻译为:减少,缩小。
通过入参的Function,我们能够将list归约成一个值。
它的返回类型是Optional类型
Optional<String> reduced =
stringCollerion
.stream()
.sorted()
.reduce((s1,s2)->s1+"#"+s2);
reduced.ifPresent(System.out::println);
// “aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2”
以上是常见的几种流式操作,还有其他的一些流式操作,可以帮助我们更便捷的处理集合数据。
Java Stream流
中间操作
filter()
map()
flatMap(0
distinct()
peek()
终端操作
anyMath()
allMathc()
noneMatch(0
collect()
count()
findAny()
findFirst()
forEach()
min()
reduce()
toArray()
sorted()