java8 新特性

这篇具有很好参考价值的文章主要介绍了java8 新特性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、lambda表达式

Lambda 是一个 匿名函数,我们可以把 Lambda 表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。

(1)语法

Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda操作符或 箭头操作符。它将 Lambda 分为两个部分:

左侧:指定了 Lambda 表达式需要的参数列表

右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即Lambda 表达式要执行的功能。

语法格式一 : 无参,无返回值

Rannable r1 = () -> {System.out.println("Hello Lanbda !");}

语法格式二: :Lambda 需要一个参数,但是没有返回值。

Cousumer<String> con = (String str) -> {System.out.println("str");}

语法格式三 : 数据类型可以省略 ,因为可由编译器推断得出,称为“类型推断”

Cousumer<String> con = (str) -> {System.out.println("str");}

语法格式四: :Lambda 若只需要一个参数时, 参数的小括号可以省略

Cousumer<String> con = str -> {System.out.println("str");}

语法格式五: :Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值

Comparator<Integer> com = (x,y) -> { System.out.println("实现函数式接口方法"); return Integer.compare(x,y); }

语法格式六 :当Lambda 体只有一条语句时,return与大括号若有,都可以省略

Comparator<Integer> com = (x,y) -> Integer.compare(x,y);

(2)类型推断

Lambda表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”。

(3)应用示例
       // 1.创建线程
       new Thread(() -> {
           // method run,do something
       }, "threadName").start();

       // 2.匿名类
        JButton show = new JButton("show");
        show.addActionListener(e -> {
           // method actionPerformed()
        });

       // 3.forEach迭代
        List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
        features.forEach(System.out::println);

        // 4.map 和reduce
        List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500, 600);
        costBeforeTax.stream().map(e -> e + 0.12 * e).forEach(System.out::print);
        double bill = costBeforeTax.stream().map(e -> e + 0.12 * e)
                .reduce((sum, cost) -> sum + cost).get();
        System.out.println(bill);

        // 5.过滤 filter 收集 collect
        List<String> strs = Arrays.asList("abc", "defg", "hi", "jkmln");
        List<String> filtered = strs.stream().filter(e -> e.length() > 2).collect(Collectors.toList());

        // 6.去重
        List<Integer> nums = Arrays.asList(1 ,2, 3, 1, 4, 5, 2, 6, 8, 7, 6);
        nums = nums.stream().distinct().collect(Collectors.toList());

        // 7.计算最大值、最小值、平均值、总和
        List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
        IntSummaryStatistics stats = primes.stream().mapToInt(e -> e).summaryStatistics();
        System.out.println("最大值:" +  stats.getMax());
        System.out.println("最小值:" +  stats.getMin());
        System.out.println("平均值:" +  stats.getAverage());
        System.out.println("总和:" +  stats.getSum());
        System.out.println("计数:" +  stats.getCount());
(4)限制

lambda表达式有个限制,只能引用final和final局部变量,也就是说不能再lambda表达式内部修改定义再域外的变量。否则编译报错:

java8 新特性,J2SE,Java8,java,java8新特性

2、函数式(Functional)接口

只包含一个抽象方法的接口,称为 函数式接口。

Lambda表达式就是一个函数式接口的实例。匿名实现类表示的现在都可以用Lambda表达式来写。

java内置四大核心函数式接口:

java8 新特性,J2SE,Java8,java,java8新特性

3、方法引用与构造器引用

 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!

 方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。

 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!

 格式:使用操作符 “::” 将类(或对象)与方法名分隔开来。如下三种主要使用情况:

对象::实例方法名

类::静态方法名

类::实例方法

// 方法引用 ClassName::methodName 
如: Comparator<Integer> com = (x,y) -> Integer.compare(x,y); 
等同于: Comparator<Integer> com = Integer::compare; 

// 构造器引用 ClassName::new 
如: Function<Integer, MyClass> fun = (n) -> new MyClass(n); 
等同于: Function<Integer, MyClass> fun = MyClass::new; 

//数组引用 type[] :: new 
如: Function<Integer, Integer[]) fun = (n) -> new Integer[n]; 
等同于: Function<Integer, Integer[]) fun = Integer::new;

4、Stream API

Stream 和 Collection 集合的区别:Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。

①Stream 自己不会存储元素。

②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。

③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

Stream操作的三个步骤:

创建Stream -> 中间操作 -> 终止操作(终端操作)

(1)创建Stream
// 方式1:通过集合 
//Java8 中的 Collection 接口被扩展,提供了两个获取流的方法: 
default Stream<E> stream() : 返回一个顺序流 
default Stream<E> parallelStream() : 返回一个并行流 
例: 
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); 
Stream<Integer> integerStream = list.stream(); 

// 方式2:通过数组 
// Java8 中的 Arrays 的静态方法 stream() 可以获取数组流: 
static <T> Stream<T> stream(T[] array): 返回一个流 
重载形式,能够处理对应基本类型的数组: 
public static IntStream stream(int[] array) 
public static LongStream stream(long[] array) 
public static DoubleStream stream(double[] array) 
例: IntStream stream = Arrays.stream(new int[]{1, 2, 3, 4, 5}); 

// 方式3:通过Stream的of() 
public static<T> Stream<T> of(T... values) // 接收任意可变参数,返回一个流 
例: Stream<String> stringStream = Stream.of("AA", "BB", "CC"); 

// 方式4: 创建无限流 
>迭代 public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) >
生成 public static<T> Stream<T> generate(Supplier<T> s) 
例: 
// 迭代 
Stream<Integer> stream = Stream.iterate(0, x -> x + 2); stream.limit(10).forEach(System.out::println); 
// 生成 
Stream<Double> stream1 = Stream.generate(Math::random); stream1.limit(10).forEach(System.out::println);
(2)Stream的中间操作

(2.1)筛选与切片

java8 新特性,J2SE,Java8,java,java8新特性

Person p1 = new Person("tom", 11); 
Person p2 = new Person("jerry", 8); 
Person p3 = new Person("marry", 5); 
Person p4 = new Person("john", 14); 
ArrayList<Person> list = new ArrayList<>(); 
list.add(p1); 
list.add(p2); 
list.add(p3); 
list.add(p4); 
// 过滤 
List<Person> collect = list.stream() .filter(p -> p.getAge() > 10).collect(Collectors.toList()); 
// 去重 
Person p5 = new Person("john", 14); 
collect = list.stream() .distinct() .collect(Collectors.toList()); 
// 截断 
collect = list.stream() .limit(2) .collect(Collectors.toList()); 
// 跳过元素 
collect = list.stream() .skip(2) .collect(Collectors.toList());

(2.2)映射

java8 新特性,J2SE,Java8,java,java8新特性

List<String> nameList = list.stream() 
.map(Person::getName) 
.collect(Collectors.toList()); // map()和flatMap类似于集合的add()和addAll(),后者会展开元素

(2.3)排序

java8 新特性,J2SE,Java8,java,java8新特性

// 自定义比较 
List<Person> sortedList = list.stream() .sorted((e1, e2) -> e1.getAge()-e2.getAge()) .collect(Collectors.toList()); 
// 数值的比较方法 
sortedList = list.stream() .sorted((e1, e2) -> Integer.compare(e1.getAge(), e2.getAge())) .collect(Collectors.toList()); 
// Comparator的静态比较方法 
sortedList = list.stream() .sorted(Comparator.comparingInt(Person::getAge)) .collect(Collectors.toList());
(3)Stream的终止操作

(3.1)匹配与查找

java8 新特性,J2SE,Java8,java,java8新特性

boolean allMatch = list.stream().allMatch(e -> e.getAge() > 10); 
Optional<Person> first = list.stream().findFirst(); 
list.stream().filter(e -> e.getAge() > 10).count(); 
Optional<Person> max = list.stream() .filter(e -> e.getAge() > 10) .max(Comparator.comparingInt(Person::getAge)); 
list.stream().filter(e -> e.getAge() > 10).forEach(System.out::println);

(3.2)归约

java8 新特性,J2SE,Java8,java,java8新特性

Optional<Integer> reduce = list.stream() .map(Person::getAge) .reduce((e1, e2) -> e1 + e2);

(3.3)收集

java8 新特性,J2SE,Java8,java,java8新特性

(4)Collectors

java8 新特性,J2SE,Java8,java,java8新特性

5、Optional类

Optional<T> 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。

Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

创建Optional 类对象的方法:

 Optional.of(T t) : 创建一个 Optional 实例,t必须非空;

 Optional.empty() : 创建一个空的 Optional 实例

 Optional.ofNullable(T t) :t可以为null

判断Optional 容器中是否包含对象:

 boolean isPresent() : 判断是否包含对象

 void ifPresent(Consumer<? super T> consumer) :如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它。

获取Optional 容器的对象:

 T get(): 如果调用对象包含值,返回该值,否则抛异常

 T orElse(T other) :如果有值则将其返回,否则返回指定的other对象。

 T orElseGet(Supplier<? extends T> other) : :如果有值则将其返回,否则返回由Supplier接口实现提供的对象。

 T orElseThrow(Supplier<? extends X> exceptionSupplier) : :如果有值则将其返

回,否则抛出由Supplier接口实现提供的异常。文章来源地址https://www.toymoban.com/news/detail-697890.html

//使用Optional类的getGirlName(): 
public String getGirlName2(Boy boy){ 
    Optional boyOptional = Optional.ofNullable(boy); 
    //此时的boy1一定非空 
    Boy boy1 = boyOptional.orElse(new Boy(new Girl("迪丽热巴"))); 
    Girl girl = boy1.getGirl(); 
    Optional girlOptional = Optional.ofNullable(girl); 
    //girl1一定非空 
    Girl girl1 = girlOptional.orElse(new Girl("古力娜扎"));
    return girl1.getName(); 
}

到了这里,关于java8 新特性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java8新特性整理记录

    方法一:  方法二:   例子:

    2024年02月11日
    浏览(25)
  • Java8新特性—方法引用

    前言 Java 8引入了方法引用(method reference)作为一种语言特性,它可以简化代码,使得代码更加易读和易于维护。方法引用可以被视为Lambda表达式的简写形式,可以用来替代Lambda表达式中只调用一个已有方法的情况。总的来说该特性使得Java代码更加简洁和灵活。 使用场景 J

    2024年02月03日
    浏览(30)
  • Java8的新特性以及使用

    1.   通 过 1 0 个示 例 来 初 步认 识 J a v a 8 中 的 l a m bd a 表达 式   我个 人 对 J a v a   8 发 布 非 常 激动 , 尤 其 是 l a m b d a 表 达式 和 流 AP I 。 越 来 越 多 的 了解 它 们 , 我 能 写 出 更 干 净 的代 码 。 虽然 一 开 始 并 不 是 这 样 。 第一 次 看 到 用 la m b d a 表

    2024年02月07日
    浏览(36)
  • Java8新特性lambda学习

    Lambda是一个 匿名函数 ,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 本质: 作为 函数式接口 的实例, 没有接口就没意义了. 这两

    2024年02月05日
    浏览(31)
  • 【Java8新特性--->异步处理】CompletableFuture

    一、引入 假设一个商品详情页需要以下操作: 查询展示商品的基本信息耗时:0.5s 查询展示商品的销售信息耗时:0.7s 查询展示商品的图片信息耗时:1s 查询展示商品销售属性耗时:0.3s 查询展示商品规格属性耗时:1.5s 查询展示商品详情信息耗时:1s 即使每个查询时间耗时不

    2024年02月06日
    浏览(28)
  • Java8新特性:Optional类(超详解)

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! 到目前为止,臭名昭著的 空指针异常 是导致Java应用程序失败的最常见原因。以前,为了解决空指

    2023年04月09日
    浏览(34)
  • Java8新特性-Lambda表达式

    Lambda表达式 Lambda是一个匿名函数, 可以把lambda表达式理解为是一段可以传递的代码,(将代码像数据一样传递) 变化 需求: 求 薪资高于5000的员工信息 Lambda基本语法 在 java8 中引入了一个新的操作符 \\\"-\\\" , 箭头操作符, 箭头操作符 将Lambda表达式拆分为两部分: 左侧: Lambda表达式的参

    2024年02月01日
    浏览(32)
  • Java8新特性—Lambda表达式

    Java 8是Java编程语言的一个版本,于2014年发布。它引入了许多新的特性和改进。 Lambda表达式是Java 8中引入的一个重要的新特性,它提供了一种更加简洁、灵活的方式来编写函数式接口的实现,从而提高了代码的可读性和简洁性。 在本文中,我们将介绍Lambda表达式的基本语法、

    2024年02月03日
    浏览(34)
  • 拥抱变化,面向Java17,Java8-18全系列特性详解

    文章目录: Java 8 新特性 Java 9 新特性 Java 10 新特性 Java 11 新特性 Java 12 新特性 Java 13 新特性 Java 14 新特性 Java 15 新特性 Java 16 新特性 Java 17 新特性 Java 18 新特性 💡 文章较长,建议点赞、收藏、评论后慢慢看,合理利用 “ 只看目录功能 ” 当我们大部分Javaer还沉浸在Java 8 的

    2024年01月16日
    浏览(27)
  • 【Java基础-JDK21新特性】它发任它发,我用java8

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包