java8中的空接口有什么用_JAVA8学习笔记—常用内置接口和Stream中间操作了解

惭愧,JAVA8已经发布7年了,接触JAVA也有2年多,JDK14都已经发布,居然现在还在学习JAVA8新特性,面壁三分钟。

下午抽空了解了一些JAVA8常用内置接口和Stream中间操作,记录一下学习的笔记。

Supplier接口:

通俗的说,就是一个提供者,只有一个get()方法,输出方法体的执行结果。

1 @FunctionalInterface //表示函数式接口检查,如果不是,会报错

2 public interface Supplier{3 T get();4 }

因为是函数式接口,所以可以使用lambda表达式:

1 str1.orElseGet(new Supplier() {2 @Override3 publicString get() {4 return "123";5 }6 });7

可以简写为:

1 str1.orElseGet(() -> "123");

典例:

结合Optional对象使用: Optional是java8用来消灭空指针的对象,对参数进行包装

1 //创建一个Optional对象,泛型决定了包装的数据类型2 //ofNullable表示参数可以为null3 //相同的,Optional.of(null)不允许参数为null,否则抛出空指针异常

4 Optional str1 = Optional.ofNullable(null);5 //orElseGet(Supplier接口 extends 定义Optional时的泛型)6 //表示如果str1为null,就执行supplier接口的get方法7 //返回的类型必须是定义Optional时的类型或其子类

8 String newStr = str1.orElseGet(() -> "123");

Consumer接口:

消费者,只有一个accept的抽象方法,传入一个泛型类型的值,对值进行操作,不返回

1 @FunctionalInterface2 public interface Consumer{3 voidaccept(T t);4 }

典例:

配合java8的Stream和forEach,遍历数据,进行操作,后边会有综合用例

Function接口:

提供者和消费者的结合体,有参有返回,泛型表示传入T类型,返回R类型

1 @FunctionalInterface2 public interface Function{3 R apply(T t);4 }

典例:

将数组元素String类型转为Integer类型,并加10,遍历(遍历就用到了Consumer接口)

这里,用到了 Stream map(Function super T, ? extends R> mapper),可以看到,他的参数就是Function接口

map的作用,是将数组或集合放入流中,转换元素的类型,返回流

1 Stream stream2 = Arrays.stream(new String[]{"1","2","3","4"});2 stream2.map(x->Integer.valueOf(x)+10).forEach(System.out::println);

Predicate接口:

传入一个对象,返回一个boolean值,一般用来做判断逻辑

1 @FunctionalInterface2 public interface Predicate{3 booleantest(T t);4 }

典例:

过滤大于1的元素,再遍历元素

这里用到了Stream filter(Predicate super T> predicate),它的参数就是Predicate类型

filter的作用,是对元素进行逻辑判断,返回boolean为true的结果流

Stream stream1 = Arrays.stream(new String[]{"1","2","3","4"});

stream1.filter(x->Integer.valueOf(x) > 1).forEach(System.out::println);

上述例子,已经将Stream流的filter,map方法介绍了,其他的中间操作都差不多,这里再介绍一个特殊的flatMap

filtMap:

Stream flatMap(Function super T, ? extends Stream extends R>> mapper)

传入一个Function函数,有两个参数,第二个参数是Stream流对象

结合Function函数的功能:转换参数类型,大概就是:执行Function函数,将结果流合并到当前流中,就是一个合并流的功能.

典例:

切割所有数组元素,并遍历输出

1 Stream stream3 = Arrays.stream(new String[]{"富强","民主","文明","和谐"});2 //对字符串数组元素String分别切割,得到的是String[],符合map转变类型的规则3 //这个时候forEach打印,打印的是数组

4 stream3.map(x->x.split("")).forEach(System.out::println);//[Ljava.lang.String;@7085bdee5

6 //正确用法7 //使用flatMap实现合并流

8 Stream stream4 = Arrays.stream(new String[]{"富强","民主","文明","和谐"});9 //这里,相当于分别对四个数组元素切割,形成四个数组,再进行流合并,将四个数组分别放入流中,进行遍历

10 stream4.map(x->x.split("")).flatMap(x->Arrays.stream(x)).forEach(System.out::println);

能看懂上面这些例子,基本上很多Java8的代码就可以理解了,还有一些Stream流的终端操作,抽空再进行学习.

只看不做的人永远学不会!!!

更多参考:https://blog.csdn.net/qq_28410283/article/details/80962325

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值