JAVA8学习笔记—常用内置接口和Stream中间操作了解

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

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

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

1 @FunctionalInterface //表示函数式接口检查,如果不是,会报错    
2 public interface Supplier<T> {
3     T get();
4 }

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

1 str1.orElseGet(new Supplier<String>() {
2     @Override
3     public String get() {
4         return "123";
5     }
6 });
7     

可以简写为:

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

典例:

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

1 //创建一个Optional对象,泛型决定了包装的数据类型
2 //ofNullable表示参数可以为null
3 //相同的,Optional.of(null)不允许参数为null,否则抛出空指针异常
4 Optional<String> 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 @FunctionalInterface    
2 public interface Consumer<T> {
3     void accept(T t);
4 }

典例:

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

Function接口:

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

1 @FunctionalInterface
2 public interface Function<T, R> {
3     R apply(T t);
4 }

典例:

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

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

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

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

Predicate接口:

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

1 @FunctionalInterface
2 public interface Predicate<T> {
3     boolean test(T t);
4 }

典例:

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

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

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

Stream<String> 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:

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

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

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

典例:

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

 1 Stream<String> stream3 = Arrays.stream(new String[]{"富强","民主","文明","和谐"});
 2 //对字符串数组元素String分别切割,得到的是String[],符合map转变类型的规则
 3 //这个时候forEach打印,打印的是数组
 4 stream3.map(x->x.split("")).forEach(System.out::println);//[Ljava.lang.String;@7085bdee
 5 
 6 //正确用法
 7 //使用flatMap实现合并流
 8 Stream<String> 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

posted @ 2020-04-03 18:18  念欲似毒  阅读(478)  评论(0编辑  收藏  举报