JDK1.8新特性

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值