惭愧,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