标题

  • 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新特性特点

  1. 速度更快
  2. 代码更少(增加了新的语法:Lambda 表达式)
  3. 强大的 Stream API
  4. 便于并行
  5. 最大化减少空指针异常:Optional Nashorn引擎,
  6. 允许在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的其它 新特性(笔记二十四)相关推荐

  1. 嵌入式Linux驱动笔记(二十四)------framebuffer之使用spi-tft屏幕(上)

    你好!这里是风筝的博客, 欢迎和我一起交流. 最近入手了一块spi接口的tft彩屏,想着在我的h3板子上使用framebuffer驱动起来. 我们知道: Linux抽象出FrameBuffer这个设备 ...

  2. 【Visual C++】游戏开发笔记二十四 由DirectX的几个版本说开去

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  3. Mr.J-- jQuery学习笔记(二十四)--剖析jQuery源码--extend

    定义和用法 jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象. 注意:1. 如果只为$.extend()指定了一个参数,则意味着参数target被省略.此时,target就 ...

  4. 爪哇国新游记之二十四----二叉树

    /*** 二叉树节点类* */ class Node<T extends Comparable> {public Node(T data){this.data=data;}T data;N ...

  5. Java笔记二十四——Spring开发

    Spring是一个支持快速开发Java EE应用程序的框架.它提供了一系列底层容器和基础设施,并可以和大量常用的开源框架无缝集成,可以说是开发Java EE应用程序的必备. 在Spring Frame ...

  6. 机器学习笔记二十四 中文分词资料整理

    一.常见的中文分词方案 1. 基于字符串匹配(词典) 基于规则的常见的就是最大正/反向匹配,以及双向匹配. 规则里糅合一定的统计规则,会采用动态规划计算最大的概率路径的分词. 以上说起来很简单,其中还 ...

  7. 【OpenGL】笔记二十四、立方体贴图

    1. 流程 之前我们使用了不少2D形式的贴图,那么现在有没有其他类型的贴图呢?当然有,比如立方体贴图,它就是由6个2D贴图组合而成的: 那么为什么要把6张纹理合并到一张纹理中,而不是直接使用6个单独的 ...

  8. [傅里叶变换及其应用学习笔记] 二十四. 级联,脉冲响应

    我们上节课学习了 在离散有限维空间中,任何线性系统都是通过矩阵间的相乘得到的 在连续无限维空间中,任何线性系统都是通过对核函数的积分得到的 脉冲响应(impulse response) 级联线性系统( ...

  9. 设计模式笔记二十四:模板模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论(本文大部分转自原文) 在模板模式(Template Pattern)中,一 ...

最新文章

  1. leetcode--链表的设计--python
  2. 怎么查看这个历史最大连接session数
  3. 信息化监理是请来的第三者?
  4. EasyBridge:一种简单的js-bridge设计方案
  5. 【机器学习基础】Python数据预处理:彻底理解标准化和归一化
  6. java ,c# 解决安全沙箱问题
  7. java语言如何跳转界面_在java中spring mvc页面如何跳转,详细图解
  8. bat批处理笔记(二)
  9. nginx是干嘛用的_上帝视角——面试官常问的nginx的几个问题
  10. VM 虚拟机 centos7 安装redis
  11. Machine Learning(Andrew)Week6(上)
  12. Leetcode五大常用算法
  13. 订单页面添加收货地址html,添加收货地址展示
  14. 戒烟、写作、赚美金:我的2020【CSDN年度征文】
  15. python将word文档转图片_如何将word文档转换为图片
  16. 射频day5:波导为什么noTEM;相速 相波长 群速 波阻抗
  17. Java提取视频中的音频(JavaCV)
  18. 计算机硬盘图标闪烁,电脑本地磁盘图标显示异常如何解决
  19. CSS3动画实现牛顿摆
  20. JavaCV本地视频流通过帧图片添加文本进行字幕合成

热门文章

  1. 32位和64位系统对于程序员的影响
  2. 成都市中小学计算机创客,我校荣获2019四川省中小学电脑制作活动机器人暨创客竞赛团体一等奖...
  3. HTML Purifier解决XSS问题
  4. 台式计算机怎么加一个硬盘,台式电脑增加硬盘_台式电脑增加硬盘图解
  5. Abaqus CPU并行计算 加速计算信息汇总
  6. java es 如何查询_使用elasticsearch的java-api进行查询
  7. OceanBase集群手动部署
  8. kubernetes(k8s)第五部分之K8s部署nginx
  9. 值得看三次的高干文_七本值得刷10遍的高干文,本本经典,让你一次看过瘾!...
  10. html文件怎么在wps打开是乱码,wps上打开Excel文件是乱码