JAVA8学习笔记—常用内置接口和Stream中间操作了…
2020-04-03 16:09:05来源:博客园 阅读 ()
JAVA8学习笔记—常用内置接口和Stream中间操作了解
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
原文链接:https://www.cnblogs.com/nysd/p/12628189.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 学习Java 8 Stream Api (4) - Stream 终端操作之 collect 2020-06-11
- java学习之第一天 2020-06-11
- Java学习之第二天 2020-06-11
- Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Ap 2020-06-11
- Java笔记:集合 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash