Java8的其它 新特性(笔记二十四)
标题
- Java 8新特性简介
- 一、Lambda表达式
- 1、为什么使用Lambda表达式
- 2、使用举例
- 二、函数式(Functional)接口
- 1、什么是函数式(Functional)接口
- 2、如何理解函数式接口
- 3、自定义函数式接口
- 4、作为参数传递 Lambda 表达式
- 5、Java 内置四大核心函数式接口
- 6、其他接口
- 三、方法引用与构造器引用
- 1、方法引用(Method References)
- 2、构造器引用
- 3、数组引用
- 四、强大的Stream API
- 1、Stream API说明
- 2、为什么要使用Stream API
- 3、什么是 Stream
- 4、Stream 的操作三个步骤
- 5、创建 Stream方式一:通过集合
- 6、创建 Stream方式二:通过数组
- 7、创建 Stream方式三:通过Stream的of()
- 8、创建 Stream方式四:创建无限流
- 9、Stream 的中间操作
- 10、Stream 的终止操作
- 五、Optional类
Java 8新特性简介
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。
Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以
来最具革命性的版本。Java 8为Java语言、编译器、类库、开发
工具与JVM带来了大量新特性。
java8新特性特点
- 速度更快
- 代码更少(增加了新的语法:Lambda 表达式)
- 强大的 Stream API
- 便于并行
- 最大化减少空指针异常:Optional Nashorn引擎,
- 允许在JVM上运行JS应用
并行流与串行流
一、Lambda表达式
1、为什么使用Lambda表达式
Lambda 是一个**匿名函数**,我们可以把 Lambda 表达式理解为是**一段可以传递的代码**(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
2、使用举例
Lambda表达式的本质:作为接口的实例
举例1、从匿名类到 Lambda 的转换
@Testpublic void test() {Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("我是小E");}};r1.run();//Lambda来写System.out.println("*****************");Runnable r2 = () -> System.out.println("我是小明");r2.run();}
举例2、从匿名类到 Lambda 的转换
@Testpublic void test3() {Consumer<String> con = new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}};con.accept("婚姻是爱情的港湾?");System.out.println("*************************");Consumer<String> con1 = (String s) -> System.out.println(s);con1.accept("是吧!");}
//语法格式三:数据类型可以省略,因为可由编译器推断得出,称为"类型推断@Testpublic void test4() {Consumer<String> con = (String s)-> { System.out.println(s);};con.accept("你没有饭吃?");System.out.println("*************************");Consumer<String> con1 = (s) -> System.out.println(s);con1.accept("是的!");}
@Testpublic void test1() {//原始写法Comparator<Integer> comparator = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1, o2);}};int com1 = comparator.compare(12, 21);System.out.println(com1);System.out.println("***********************");//Lambda表达式的写法Comparator<Integer> com2= (o1,o2) ->Integer.compare(o1,o2);int compare2 = com2.compare(32,90);System.out.println(compare2);System.out.println("***********************");//方法引用Comparator<Integer> com3= Integer::compare;int compare3 = com2.compare(132,98);System.out.println(compare3);}
方法引用可参考:https://blog.csdn.net/kegaofei/article/details/80582356
”基本语法: (parameters) -> expression 或 (parameters) ->{ statements; }
// 1. 不需要参数,返回值为 5
() -> 5 // 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x // 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y // 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
二、函数式(Functional)接口
1、什么是函数式(Functional)接口
2、如何理解函数式接口
3、自定义函数式接口
4、作为参数传递 Lambda 表达式
5、Java 内置四大核心函数式接口
6、其他接口
@Testpublic void test5(){happyTime(500, new Consumer<Double>() {@Overridepublic void accept(Double aDouble) {System.out.println("今天星期五!这周存款为:"+aDouble);}});System.out.println("*****************");happyTime(300,money-> System.out.println("今天星期五!这周存款为:" + money));}public void happyTime(double money,Consumer<Double> con){con.accept(money);}
@Testpublic void test6(){List<String> list = Arrays.asList("小明","李晓","张天爱","赵丽颖","刘德华","华哥");List<String> filterStrs=filterString(list, new Predicate<String>() {@Overridepublic boolean test(String s) {return s.contains("明");}});System.out.println(filterStrs);System.out.println("******lambda******");List<String> filterStrs1 =filterString(list,s ->s.contains("明"));System.out.println(filterStrs1);}//根据给定的规则,过滤集合中的字符串。此规则由Predicate的方法决定public ArrayList<String> filterString(List<String> list, Predicate<String> pre){ArrayList<String> filterList = new ArrayList<>();for (String s : list){if(pre.test(s)){filterList.add(s);}}return filterList;}
三、方法引用与构造器引用
1、方法引用(Method References)
2、构造器引用
3、数组引用
四、强大的Stream API
1、Stream API说明
2、为什么要使用Stream API
3、什么是 Stream
4、Stream 的操作三个步骤
5、创建 Stream方式一:通过集合
6、创建 Stream方式二:通过数组
7、创建 Stream方式三:通过Stream的of()
8、创建 Stream方式四:创建无限流
9、Stream 的中间操作
import java.util.ArrayList;
import java.util.List;
/*** 提供用于测试的数据* * @author shkstart 邮箱:shkstart@126.com**/
public class EmployeeData {public static List<Employee> getEmployees(){List<Employee> list = new ArrayList<>();list.add(new Employee(1001, "马化腾", 34, 6000.38));list.add(new Employee(1002, "马云", 12, 9876.12));list.add(new Employee(1003, "刘强东", 33, 3000.82));list.add(new Employee(1004, "雷军", 26, 7657.37));list.add(new Employee(1005, "李彦宏", 65, 5555.32));list.add(new Employee(1006, "比尔盖茨", 42, 9500.43));list.add(new Employee(1007, "任正非", 26, 4333.32));list.add(new Employee(1008, "扎克伯格", 35, 2500.32));return list;}
}
public class Employee {private int id;private String name;private int age;private double salary;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public Employee() {}public Employee(int id) {this.id = id;}public Employee(int id, String name) {this.id = id;this.name = name;}public Employee(int id, String name, int age, double salary) {this.id = id;this.name = name;this.age = age;this.salary = salary;}@Overridepublic String toString() {return "Employee{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", salary=" + salary + '}';}@Overridepublic boolean equals(Object o) {if (this == o)return true;if (o == null || getClass() != o.getClass())return false;Employee employee = (Employee) o;if (id != employee.id)return false;if (age != employee.age)return false;if (Double.compare(employee.salary, salary) != 0)return false;return name != null ? name.equals(employee.name) : employee.name == null;}@Overridepublic int hashCode() {int result;long temp;result = id;result = 31 * result + (name != null ? name.hashCode() : 0);result = 31 * result + age;temp = Double.doubleToLongBits(salary);result = 31 * result + (int) (temp ^ (temp >>> 32));return result;}
}
10、Stream 的终止操作
//归约@Testpublic void test(){//1、reduce(T iden, BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回
// 练习1:计算1-10的自然数的和List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);Integer sum =list.stream().reduce(0,Integer::sum);System.out.println(sum);// 练习2:计算公司所有员工工资的总和List<Employee> employees =EmployeeData.getEmployees();Stream<Double> stream = employees.stream().map(Employee ::getSalary);
// Optional<Double> sumMoney = stream.reduce(Double::sum);Optional<Double> sumMoney = stream.reduce((d1,d2)-> d1+d2);System.out.println(sumMoney);}
@Testpublic void test3(){// 练刃1:查找工资大于6000的员工,结果返回为一个List或setList<Employee> employees =EmployeeData.getEmployees();
// List<Employee> collect = employees.stream().filter(e -> e.getSalary() > 6000).collect(Collectors.toList());// collect.forEach(System.out::println);System.out.println("***********list************");employees.stream().filter(e -> e.getSalary() > 6000).collect(Collectors.toList()).forEach(System.out::println);System.out.println("***********set************");employees.stream().filter(e -> e.getSalary() > 6000).collect(Collectors.toSet()).forEach(System.out::println);}
五、Optional类
Java8的其它 新特性(笔记二十四)相关推荐
- 嵌入式Linux驱动笔记(二十四)------framebuffer之使用spi-tft屏幕(上)
你好!这里是风筝的博客, 欢迎和我一起交流. 最近入手了一块spi接口的tft彩屏,想着在我的h3板子上使用framebuffer驱动起来. 我们知道: Linux抽象出FrameBuffer这个设备 ...
- 【Visual C++】游戏开发笔记二十四 由DirectX的几个版本说开去
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- Mr.J-- jQuery学习笔记(二十四)--剖析jQuery源码--extend
定义和用法 jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象. 注意:1. 如果只为$.extend()指定了一个参数,则意味着参数target被省略.此时,target就 ...
- 爪哇国新游记之二十四----二叉树
/*** 二叉树节点类* */ class Node<T extends Comparable> {public Node(T data){this.data=data;}T data;N ...
- Java笔记二十四——Spring开发
Spring是一个支持快速开发Java EE应用程序的框架.它提供了一系列底层容器和基础设施,并可以和大量常用的开源框架无缝集成,可以说是开发Java EE应用程序的必备. 在Spring Frame ...
- 机器学习笔记二十四 中文分词资料整理
一.常见的中文分词方案 1. 基于字符串匹配(词典) 基于规则的常见的就是最大正/反向匹配,以及双向匹配. 规则里糅合一定的统计规则,会采用动态规划计算最大的概率路径的分词. 以上说起来很简单,其中还 ...
- 【OpenGL】笔记二十四、立方体贴图
1. 流程 之前我们使用了不少2D形式的贴图,那么现在有没有其他类型的贴图呢?当然有,比如立方体贴图,它就是由6个2D贴图组合而成的: 那么为什么要把6张纹理合并到一张纹理中,而不是直接使用6个单独的 ...
- [傅里叶变换及其应用学习笔记] 二十四. 级联,脉冲响应
我们上节课学习了 在离散有限维空间中,任何线性系统都是通过矩阵间的相乘得到的 在连续无限维空间中,任何线性系统都是通过对核函数的积分得到的 脉冲响应(impulse response) 级联线性系统( ...
- 设计模式笔记二十四:模板模式
原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论(本文大部分转自原文) 在模板模式(Template Pattern)中,一 ...
最新文章
- leetcode--链表的设计--python
- 怎么查看这个历史最大连接session数
- 信息化监理是请来的第三者?
- EasyBridge:一种简单的js-bridge设计方案
- 【机器学习基础】Python数据预处理:彻底理解标准化和归一化
- java ,c# 解决安全沙箱问题
- java语言如何跳转界面_在java中spring mvc页面如何跳转,详细图解
- bat批处理笔记(二)
- nginx是干嘛用的_上帝视角——面试官常问的nginx的几个问题
- VM 虚拟机 centos7 安装redis
- Machine Learning(Andrew)Week6(上)
- Leetcode五大常用算法
- 订单页面添加收货地址html,添加收货地址展示
- 戒烟、写作、赚美金:我的2020【CSDN年度征文】
- python将word文档转图片_如何将word文档转换为图片
- 射频day5:波导为什么noTEM;相速 相波长 群速 波阻抗
- Java提取视频中的音频(JavaCV)
- 计算机硬盘图标闪烁,电脑本地磁盘图标显示异常如何解决
- CSS3动画实现牛顿摆
- JavaCV本地视频流通过帧图片添加文本进行字幕合成
热门文章
- 32位和64位系统对于程序员的影响
- 成都市中小学计算机创客,我校荣获2019四川省中小学电脑制作活动机器人暨创客竞赛团体一等奖...
- HTML Purifier解决XSS问题
- 台式计算机怎么加一个硬盘,台式电脑增加硬盘_台式电脑增加硬盘图解
- Abaqus CPU并行计算 加速计算信息汇总
- java es 如何查询_使用elasticsearch的java-api进行查询
- OceanBase集群手动部署
- kubernetes(k8s)第五部分之K8s部署nginx
- 值得看三次的高干文_七本值得刷10遍的高干文,本本经典,让你一次看过瘾!...
- html文件怎么在wps打开是乱码,wps上打开Excel文件是乱码