ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

生产都用jdk11了,我的知识还停留在jdk8(jdk9新特性分析)

2021-07-11 09:58:23  阅读:331  来源: 互联网

标签:Predicate myList Stream Point jdk11 jdk9 jdk8 new Optional


文章目录

背景

目前生产和开发中使用的jdk版本已经是11了,而自己对虽然对jdk8之后的版本看过一些博客,对新特性有一些了解,但没有全面学习过,所以今天就借这个时间系统性了解下,jdk8之后到11的新特性,咸鱼

JDK9新特性

授人以鱼不如授人以渔,这里给出官网的地址

官网全面介绍地址
几个常用api的变动

这里我对常用api变动内容作一些翻译总结吧

1. Factory Methods for Collections (JEP 269)

添加了集合工厂方法

jdk8创建一个不可变集合代码

List<Point> myList = new ArrayList<>);
myList.add(new Point(1, 1));
myList.add(new Point(2, 2));
myList.add(new Point(3, 3));
myList.add(new Point(4, 4));
myList = Collections.unmodifiableList(myList);

可以看到还是挺麻烦的,比较方便我们可以使用Guava中的

  Lists.newArrayList();

需要引入额外的jar,现在jdk9原生的api也支持这些操作

	List<Point> list = List.of(new Point(1, 1), new Point(2, 2), 
    new Point(3, 3), new Point(4, 4));

2. Optional Class Enhancements

Optional 类的增强
在jdk9 中Optional 中增加了四个新方法

  • ifPresent(Consumer action): 如果存在一个值,使用该值执行操作
public void ifPresent(Consumer<? super T> action) {
        if (value != null) {
            action.accept(value);
        }
    }
  • ifPresentOrElse(Consumer action, Runnable emptyAction):但如果没有值,则执行emptyAction
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) {
        if (value != null) {
            action.accept(value);
        } else {
            emptyAction.run();
        }
    }
  • or(Supplier supplier):如果值存在,返回 Optional 指定的值,否则返回一个预设的值。
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier) {
        Objects.requireNonNull(supplier);
        if (isPresent()) {
            return this;
        } else {
            @SuppressWarnings("unchecked")
            Optional<T> r = (Optional<T>) supplier.get();
            return Objects.requireNonNull(r);
        }
    }
  • stream(): 根据是否存在值,返回一个零元素或一个元素的流
public Stream<T> stream() {
        if (!isPresent()) {
            return Stream.empty();
        } else {
            return Stream.of(value);
        }
    }

有java8基础看这些方法还是很清晰知道这些方法是干嘛的,所以这里就不作过多解释,具体的不懂的可以在使用的时候直接查看源码上的注释,都挺详细的

3.Stream API Enhancements

stream api的增强,新增了四个方法。

首先看看

takeWhile(Predicate) 和 dropWhile(Predicate)

default Stream<T> takeWhile(Predicate<? super T> predicate) {// ...}

default Stream<T> dropWhile(Predicate<? super T> predicate) {//...}

这两个方法limit ()和 skip ()方法的补充。不同的是他们的参数很灵活使用的一个Predicate函数

takeWhile 和 java8 中的filter很像,不同的是filter是匹配满足所有的,而takeWhile是只要后面的有一个不满足,就不继续匹配了,可以看看下面的例子

Stream.of("a","b","c","","e","f").takeWhile(s->!s.isEmpty())
         .forEach(System.out::print); 
         //输出 abc

dropWhile 与 takeWhile 相反

Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty())
         .forEach(System.out::print);
         // 输出 ef

看样子有点鸡肋哈哈,目前来说没有看到适合的业务场景

ofNullable(T t)

如果指定元素为非 null,则获取一个元素并生成单个元素流,元素为 null 则返回一个空流。

show code

long count = Stream.ofNullable(100).count();
	  // 1
      System.out.println(count);
 
      count = Stream.ofNullable(null).count();
      // 0
      System.out.println(count);

iterate 方法

static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)

构建一个无限流,第二个参数是终止条件,第三个参数是递归到下一层的参数

show code

// 输出: 
// 3
// 6
// 9
IntStream.iterate(3, x -> x < 10, x -> x+ 3).forEach(System.out::println);

总结

jdk9的新特性远远不止这些,但是限于篇幅,就介绍几个常见的吧,如果想学习更多推荐去官网学习,获取去菜鸟教程,我看菜鸟教程也挺详细的,而且是中文。这里给一份菜鸟教程的目录吧,感觉比我说的好。。。。
在这里插入图片描述
这里也给出菜鸟教程链接

标签:Predicate,myList,Stream,Point,jdk11,jdk9,jdk8,new,Optional
来源: https://blog.csdn.net/qq_42651904/article/details/118650131

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有