JDK1.8新特性

JDK1.8新特性

    • 🍓IDE环境调整
    • 🍓lambda表达式
        • 🍒代码实现
        • 🍒常用内置函数式接口
    • 🍓接口新增方法
    • 🍓Stream流
        • 🍒reduce终结
        • 🍒并行流

🍓IDE环境调整

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🍓lambda表达式

  • lambda表达式的标准格式:

    (参数列表) -> {函数体;
    }
    
  • lambda表达式的省略规则:

    1. 📌小括号内参数的类型可以省略
    2. 📌如果小括号内有且仅有一个参数,则小括号可以省略
    3. 📌如果大括号有且仅有一个语句,可以同时省略大括号、return关键字和分号
  • lambda表达式应用的前提条件:

    • 📌方法的参数或局部变量的类型必须为接口
    • 📌接口中有且仅有一个方法
  • lambda表达式与匿名内部类的区别:

    1. 📌所需的类型不一样
      匿名内部类,需要的类型可以是类,抽象类,接口
      Lambda表达式,需要的类型必须是接口
    2. 📌抽象方法的数量不一样
      匿名内部类所需的接口中抽象方法的数量随意
      Lambda表达式所需的接口只能有一个抽象方法
    3. 📌实现原理不同
      匿名内部类是在编译后会形成class
      Lambda表达式是在程序运行的时候动态生成class
🍒代码实现
	//以前匿名内部类的写法new Thread(new Runnable() {public void run() {System.out.println("匿名内部类执行了");}}).start();//使用lambda表达式new Thread(() -> {System.out.println("lambda表达式执行了");}).start();//lambda的省略格式new Thread(() -> System.out.println("lambda省略表达式执行了")).start();//lambda作为局部变量的值Runnable run = () -> System.out.println("lambda省略表达式局部变量的值执行了");run.run();//匿名内部类写法十分冗余//Lambda让我们只需要关注run方法里的逻辑代码即可//Lambda就是一个匿名函数,我们只需将执行代码放到Lambda表达式即可
🍒常用内置函数式接口

这些内置接口都属于java.util.function包中

//1. Supplier接口(无参带返回值)
@FunctionalInterface
public interface Supplier<T> {public abstract T get();
}//2. Consumer接口(有参不带返回值)
@FunctionalInterface
public interface Consumer<T> {public abstract void accept(T t);
}//3. Function接口(有参带返回值)
@FunctionalInterface
public interface Function<T, R> {public abstract R apply(T t);
}//4. Predicate接口(有参返回boolean值)
@FunctionalInterface
public interface Predicate<T> {public abstract boolean test(T t);
}

🍓接口新增方法

以前接口只有抽象方法,这不利于接口功能的拓展,一旦这个接口新增了一个方法,其下所有实现的子类都要去实现这个方法,JDK8之后,接口新增了默认方法和静态方法,增强了接口拓展功能的能力。

public interface Animal {/*** 默认方法*/default void eat(){System.out.println("吃饭");}/*** 静态方法*/static void dead(){System.out.println("死亡");}
}

默认方法和静态方法的区别:

  1. ⭐默认方法通过实例调用,静态方法通过接口名调用。
  2. ⭐默认方法可以被继承,实现类可以直接使用接口默认方法,也可以重写接口默认方法。
  3. ⭐静态方法不能被继承,实现类不能重写接口静态方法,只能使用接口名调用。

🍓Stream流

方法名中文注释是否终结
filter过滤
limit获取集合前几个元素
skip跳过前面几个元素获取剩下的元素
distinct去重
concat两个流合成一个流
map类型转换
flatMap嵌套集合类型转换
sorted排序
parallel开启并行流
peek中间操作,没有任何输出,用于打印日志
count统计个数
anyMatch部分匹配
allMatch全量匹配
max最大值
min最小值
forEach遍历
toArray转为数组
collect转为集合
collect中文注释
Collectors.toList()收集为List集合
Collectors.toSet()收集为Set集合
Collectors.toMap收集为Map集合
  • ⭐集合过滤

    public void listFilter() {List<String> list = Arrays.asList("张无忌", "周芷若", "张角", "赵敏", "张三丰");//获取以张开头的集合List<String> list1 = list.stream().filter(item -> item.startsWith("张")).collect(Collectors.toList());System.out.println(list1);
    }
    
  • ⭐数组过滤

    public void arrayFilter() {String[] arr = {"张无忌", "周芷若", "张角", "赵敏", "张三丰"};String[] arr2 = Arrays.stream(arr).filter(item -> item.length() == 3).toArray(size -> new String[size]);Arrays.stream(arr2).forEach(item -> System.out.println(item));
    }
    
  • ⭐零散数据过滤

    public void streamFilter() {List<String> list = Stream.of("张无忌", "周芷若", "张角", "赵敏", "张三丰").filter(item -> item.length() == 2).collect(Collectors.toList());System.out.println(list);
    }
    
  • ⭐集合遍历

    public void foreachList() {List<String> list = Arrays.asList("张无忌", "周芷若", "张角", "赵敏", "张三丰");list.stream().forEach(item -> System.out.println(item));
    }
    
  • map集合遍历

    public void streamMap() {Map<String, String> map = new HashMap<>();map.put("name", "张三");map.put("age", "23");map.put("tel", "193321212312");map.put("certId", "231231232143124");map.put("address", "312131");map.entrySet().stream().forEach(item -> System.out.println(item.getKey()+ "=====" + item.getValue()));
    }
    
  • ⭐获取前几个元素

    public void listlimit() {List<String> list = Arrays.asList("张无忌", "周芷若", "张角", "赵敏", "张三丰");//获取以张开头的集合List<String> list1 = list.stream().limit(3).collect(Collectors.toList());System.out.println(list1);
    }
    
  • ⭐跳过前几个元素

    public void listskip() {List<String> list = Arrays.asList("张无忌", "周芷若", "张角", "赵敏", "张三丰");//获取以张开头的集合List<String> list1 = list.stream().skip(3).collect(Collectors.toList());System.out.println(list1);
    }
    
  • ⭐去重,依赖hashcodeequals方法,如果要给实体类去重,则必须重写hashcodeequals方法

    public void listDistinct() {List<String> list = Arrays.asList("张无忌", "周芷若", "张无忌", "赵敏", "张三丰");//获取以张开头的集合List<String> list1 = list.stream().distinct().collect(Collectors.toList());System.out.println(list1);
    }
    
  • ⭐两个流合并为一个流

    public void listConcat() {List<String> list1 = Arrays.asList("张无忌", "周芷若", "张无忌", "赵敏", "张三丰");List<String> list2 = Arrays.asList("郭靖", "黄蓉", "梅超风", "杨康", "杨过", "杨铁心");//获取以张开头的集合List<String> list3 = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());System.out.println(list3);
    }
    
  • ⭐计数

    public void listCount() {List<String> list = Arrays.asList("张无忌", "周芷若", "张无忌", "赵敏", "张三丰");long count = list.stream().count();System.out.println(count);
    }
    
  • ⭐部分匹配

    public void listAnyMatch() {List<String> list = Arrays.asList("张无忌", "周芷若", "张无忌", "赵敏", "张三丰");//判断集合中是否有张姓人boolean flag = list.stream().anyMatch(item -> item.startsWith("张"));System.out.println(flag);
    }
    
  • ⭐全部匹配

    public void listAllMatch() {List<String> list = Arrays.asList("张无忌", "周芷若", "张恒", "赵敏", "张三丰");//判断集合中是否全部姓张boolean flag = list.stream().allMatch(item -> item.startsWith("张"));System.out.println(flag);
    }
    
  • ⭐排序

    public void listOrder() {//正序List<Integer> list = Arrays.asList(11, 2, 32, 4, 15, 67, 7, 8, 9, 10);list.stream().sorted().forEach(item -> System.out.println(item));System.out.println();//倒序list.stream().sorted((item1, item2) -> item2 - item1).forEach(item -> System.out.println(item));
    }
    
  • ⭐嵌套集合遍历

    public void flotMap() {List<String> manList = Arrays.asList("张无忌,23", "郭靖,25", "杨过,28", "赵子龙,33", "李小龙,38", "胡歌,34");List<String> girlList = Arrays.asList("蔡依林,23", "杨颖,25", "杨紫,28", "赵灵儿,33", "杨雯婷,38", "黄悦,34");List<List<String>> lists = new ArrayList<>();lists.add(manList);lists.add(girlList);//flatMap适用于嵌套的集合转换类型lists.stream().flatMap(item -> item.stream()).forEach(item -> System.out.println(item));
    }
    
  • ⭐最值

    public void maxAndmin() {List<Integer> list = Arrays.asList(11, 2, 32, 4, 15, 67, 7, 8, 9, 10);Optional<Integer> max = list.stream().max((item1, item2) -> item1 - item2);System.out.println(max);Optional<Integer> min = list.stream().min((item1, item2) -> item1 - item2);System.out.println(min);
    }
    
🍒reduce终结
  • ⭐求和
    public void sum() {List<Integer> list = Arrays.asList(11, 2, 32, 4, 15, 67, 7, 8, 9, 10);//参数一初始值 参数二计算逻辑Integer sum1 = list.stream().reduce(0, (item1, item2) -> item1 + item2);System.out.println(sum1);//参数一初始值 参数二计算逻辑Integer sum2 = list.stream().reduce(0, Integer::sum);System.out.println(sum2);//初始值为集合第一个值Optional<Integer> sum3 = list.stream().reduce(Integer::sum);System.out.println(sum3);
    }
    
  • ⭐最大值
    public void max() {List<Integer> list = Arrays.asList(11, 2, 32, 4, 15, 67, 7, 8, 9, 10);//参数一初始值 参数二计算逻辑Integer max1 = list.stream().reduce(Integer.MIN_VALUE, (item1, item2) -> Integer.max(item1, item2));System.out.println(max1);//参数一初始值 参数二计算逻辑Integer max2 = list.stream().reduce(Integer.MIN_VALUE, Integer::max);System.out.println(max2);//计算逻辑,里面初始值为集合中第一个元素的值Optional<Integer> max3 = list.stream().reduce((item1, item2) -> Integer.max(item1, item2));System.out.println(max3);
    }
    
  • ⭐最小值
    public void min() {List<Integer> list = Arrays.asList(11, 2, 32, 4, 15, 67, 7, 8, 9, 10);//参数一初始值 参数二计算逻辑Integer min1 = list.stream().reduce(Integer.MAX_VALUE, (item1, item2) -> Integer.min(item1, item2));System.out.println(min1);//参数一初始值 参数二计算逻辑Integer min2 = list.stream().reduce(Integer.MAX_VALUE, Integer::min);System.out.println(min2);//初始值为集合第一个值Optional<Integer> min3 = list.stream().reduce(Integer::min);System.out.println(min3);
    }
    
🍒并行流

Stream流默认是串形流,实现并行流请使用以下方法

public void bx() throws ExecutionException, InterruptedException {List<Integer> list = Arrays.asList(11, 2, 32, 4, 15, 67, 7, 8, 9, 10);//parallel()开启并行流//第一种方式,会最大程度占用CPU线程,耗费资源, 不推荐/*Optional<Integer> max = list.stream().parallel().peek(item -> System.out.println(item.toString() + Thread.currentThread().getName())).max((item1, item2) -> item1 - item2);System.out.println(max);*///第二种方式,线程数掌握在我们自己手中,可以避免服务器资源的占用ForkJoinPool forkJoinPool2 = new ForkJoinPool(3);ForkJoinTask<?> forkJoinTask = forkJoinPool2.submit(() -> {Optional<Integer> max = list.stream().parallel().peek(item -> System.out.println(item.toString() + Thread.currentThread().getName())).max((item1, item2) -> item1 - item2);System.out.println(max);});//阻塞forkJoinTask.get();System.out.println("主线程关闭");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143964.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM+Vue的医院住院综合服务管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

17.适配器模式(Adapter)

意图&#xff1a;将一个类的接口转换为Client希望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类在一起工作。 UML图 Target&#xff1a;定义Client使用的与特定领域相关的接口。 Client&#xff1a;与符合Target接口的对象协同工作。 Adaptee&#xf…

一文了解“期刊”、“JCR分区”、“中科院分区”

本篇文章是博主在知识拓展学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在知识拓展笔记专栏&#xff1a;…

七天学会C语言-第六天(指针)

1.指针变量与普通变量 指针变量与普通变量是C语言中的两种不同类型的变量&#xff0c;它们有一些重要的区别和联系。 普通变量是一种存储数据的容器&#xff0c;可以直接存储和访问数据的值。&#xff1a; int num 10; // 定义一个整数型普通变量num&#xff0c;赋值为10在例…

Win开启Telnet功能

Win10 开启Telnet功能 很多时候&#xff0c;我们在cmd下使用telnet功能发现显示&#xff1a;‘telnet’不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 那要怎么办呢&#xff0c;接下来我们以win10为例&#xff0c;教大家如何打开telnet功能&#xff01; 1.打…

ChatGPT批量写作文章软件

什么是ChatGPT批量写作文章。简单来说&#xff0c;它是一种使用ChatGPT技术的方法&#xff0c;可以帮助您批量生成各种类型的文章和内容。无论您是需要新闻报道、博客文章、产品描述、社交媒体帖子还是其他类型的内容&#xff0c;ChatGPT都能满足您的需求。它可以在极短的时间内…

pt28django教程

缓存 缓存是一类可以更快的读取数据的介质统称&#xff0c;读取硬盘、较复杂的计算、渲染都会产生较大的耗时。数据变化频率不会很高的场景适合使用缓存。使用缓存场景&#xff1a;博客列表页、电商商品详情页、缓存导航及页脚。 Django中设置缓存 Django中提供多种缓存方式…

windows server 远程桌面服务配置和授权解决方法

适用&#xff1a;win server 2016以上 win server默认的连接数是两个用户。 1.添加远程桌面授权服务 第一步&#xff1a;服务器管理 - 添加角色和功能打开添加角色和功能向导窗口&#xff0c;选择基于角色或给予功能安装 第二步&#xff1a;添加远程桌面会话主机和远程桌面授…

TikTok的伦理挑战:虚拟世界与现实世界的交汇

在数字时代&#xff0c;社交媒体平台已经不再只是一个信息传播的工具&#xff0c;它已经深刻地改变了我们的社交行为、价值观和伦理观。 而在这一领域的佼佼者之一&#xff0c;TikTok&#xff0c;正面临着伦理挑战&#xff0c;这是虚拟世界与现实世界交汇的产物。 本文将深入…

嵌入式Linux应用开发-基础知识-第三章 LED原理图-GPIO及操作

嵌入式Linux应用开发-基础知识-第三章 LED原理图-GPIO及操作 第三章 硬件知识_LED 原理图3.1 先来讲讲怎么看原理图 第四章 普适的 GPIO 引脚操作方法4.1 GPIO 模块一般结构4.2 GPIO 寄存器操作4.3 GPIO 的其他功能&#xff1a;防抖动、中断、唤醒 第五章 具体单板的 GPIO 操作…

若依框架前端切换TagView时刷新问题

普通view切换时刷新 原因是view的name与在菜单填写的大小写不一致&#xff0c;按若依框架规则&#xff0c;路由地址必须写为 camel 驼峰命名形式&#xff0c;组件名称必须写为 pascal首字母全大写的形式。 参考&#xff1a;https://www.cnblogs.com/shayloyuki/p/16599719.htm…

SOC芯片学习--GPIO简介

原创 硬件设计技术 硬件设计技术 2023-07-20 00:04 发表于广东 收录于合集#集成电路--IC7个 一、GPIO定义、分类&#xff1a; GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;&#xff0c;通用型之输入输出的简称&#xff0c;其接脚可以供使用者由…

linux 安装 wordpress

文章目录 linux 安装 wordpress1. wordpress 简介2. wordpress功能和特点3. 部署要求4. 环境搭建4.1 部署 nginx4.1.1 新增配置文件 4.2 部署 PHP74.2.1 查看当前版本4.2.2 YUM 安装 PHP74.2.3 查看 PHP 版本4.2.4 启动PHP-FPM4.2.5 修改配置文件4.2.6 重启服务 4.3 部署 mysql…

探索古彝文AI识别技术:助力中国传统文化的传承与发扬

目录 ⭐️ 写在前面 ⭐️ 一、什么是古彝文 1.1 古彝文介绍 1.2 古彝文与其他古文字示例 1.3 古彝文的重要性 ⭐️二、AI识别技术的挑战与前景 2.1 挑战 2.2 前景 ⭐️三、合合信息AI识别技术 3.1 智能文字识别技术&#x1f44d;&#x1f44d; 3.2 古文识别应用 ⭐…

计算机网络 第四章:网络层

一.网络层概述 1.1分组转发和路由选择 网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机&#xff0c;可以将该任务划分为分组转发和路由选择两种重要的功能。 如图所示&#xff1a;这些异构型网络如果只是需要各自内部通信&#xff0c;那它们只需要实…

分布式搜索引擎Elasticsearch

一、Elasticsearch介绍 1.Elasticsearch产生背景 大数据量的检索NoSql: not only sql,泛指非关系型的数据库Nginx的7层负载均衡和4层负载均衡2.Elasticsearch是什么 一个基于Lucene的分布式搜索和分析引擎,一个开源的高扩展的分布式全文检索引擎 Elasticsearch使用Java开发…

stack和queue

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; C&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大…

油猴(篡改猴)学习记录

第一个Hello World 注意点:默认只匹配了http网站,如果需要https网站,需要自己添加match https://*/*代码如下 这样子访问任意网站就可以输出Hello World // UserScript // name 第一个脚本 // namespace http://tampermonkey.net/ // version 0.1 // descri…

K8S-存储卷,pv,pvc

pv&#xff0c;pvc 一、emptyDir存储卷1.概述2.示例 二、hostPath存储卷1.概述 三、nfs共享存储卷1.在stor01节点上安装nfs&#xff0c;并配置nfs服务2.master节点操作3.在nfs服务器上创建index.html4.master节点操作 四、PVC 和 PV1.概述2.PV和PVC之间的相互作用遵循的生命周期…

HDLBits-Edgedetect

刚开始写的代码如下&#xff1a; module top_module (input clk,input [7:0] in,output [7:0] pedge );reg [7:0] in_pre;always (posedge clk)begin in_pre < in;endassign pedge in & ~in_pre; endmodule但是提交结果是错误的。猜想原因如下&#xff1a; assign p…