Java8初探

2020-12-16  本文已影响0人  伤口不该结疤

1、概述

1.1 为什么要学习java8

java8可以让我们编写更为简洁的代码

1.1.1 【示例1】lambda表达式

java8 lambda表达式写法

1.1.2 【示例2】stream的使用

普通写法 img_17.png

1.1.3 【示例3】filter使用

普通写法 行为参数化,把代码传统给方法

1.2 java8支持的一些新特性

1.3 函数式编程

函数式编程是一种编程范式,所谓编程范式是指一种编程风格

1.3.1 常见的编程范式

汇编指令

1.3.2 java8中的函数式编程

在函数式编程出现之前,编程的整个目的在于操作值,值是一等公民。

筛选隐藏文件

而函数式编程将方法也提升为一等公民,让编程更简单。将方法引用File::isHidden作为参数传递给listFiles

将方法引用File::isHidden作为参数传递给listFiles 两种方式对比

一言以蔽之,函数式编程只是一种编程思想,核心是函数是一等公民,而Java8是利用lambda表达式、方法引用等新特性,将函数式编程的思想引入到了Java中

1.4 为什么要变化

害怕被其他语言替代

1.4.1 java版本历史

从java版本历史来看,java更新缓慢

java版本历史

1.4.2 运行在jvm上的语言

java只是运行在jvm上的其中一种语言。同样运行在jvm上的还有scala、kotlin等,如果java不持续更新,就有可能被其他语言给替代掉

运行在jvm上的语言

1.4.3 Martin Odersky(马丁·奥德斯基)

Martin Odersky马丁·奥德斯基是函数式编程的爱好者,他终生一直在JVM平台上工作。他发明的第一个语言叫Pizza(1996年),为JVM引入了泛型,并证明了可以在 JVM 平台上实现函数式语言特性。
而Scala(2003年)是由他发明第二种编程语言 ,设计初衷是要集成面向对象编程和函数式编程的各种特性,Scala运行于Java虚拟,并兼容现有的Java程序
可以说是Pizza带来了Java1.5,Scala带来了Java8

1.4.4 强大的竞争对手kotlin

kotlin

java上定义一个类


java上定义一个类

kotlin上定义一个类


kotlin上定义一个类

kotlin推动着java发展,JDK15(2020年9月)推出了Records新特性,也可以达到简写类的目的


Point类

record Point(int x, int y) { }

2. lambda表达式

2.1 什么是lambda表达式

2.1.1 定义

2.1.2 语法格式

2.2 在哪里可以使用以及如何lambda

在函数式接口上可以使用lambda表达式

2.2.1 什么是函数式接口

2.2.3 以下哪些是函数式接口?

     public interface Adder{
          int add(int a, int b);
     }
 
     public interface SmartAdder extends Adder{
          int add(double a, double b);
     }
 
     public interface Nothing{
     }

2.2.3 【案例1】为什么Runnbale可以简写

为什么Runnbale可以简写
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("hello lambda");
    }
};

2.2.4 【案例2】Comparator

  List<Person> list = new ArrayList<>();
  list.add(new Person(18, "Tom"));
  list.add(new Person(6, "Jack"));
  list.add(new Person(20, "Hello"));
  list.add(new Person(17, "Apple"));
  // 按照名字进行排序
  list.sort(new Comparator<Person>() {
      @Override
      public int compare(Person o1, Person o2) {
          return o1.getName().compareTo(o2.getName());
      }
  });
为什么Comparator是函数式接口

2.3 方法引用

2.3.1 什么是方法引用

类型 示例
类名::静态方法 Person::sayHello
类名::实例方法 Person::getName
对象::实例方法 comparator::compare
类名::new Person::new

3. Stream API

3.1 什么是流

3.1.1 基本概念

Stream是Java8的新API,它允许以声明性的方式处理数据集合

3.1.2 什么是声明性方式

通过查询语句来表示,而不是临时编写一个实现。例如:查询年龄小于18岁的人的姓名

Stream

3.2 怎么用

3.2.1 使用流的三个步骤

使用流的三个步骤

3.2.2 生成流

3.2.3 终端操作

3.2.3 中间操作

1. 筛选

    List<Integer> numbers = Arrays.asList(1, 6, 7, 1, 1, 2, 3, 2, 6);
    numbers.stream()
            .filter(i -> i % 2 == 0)
            .distinct()
            .forEach(System.out::println);

输出

  6
  2
    Stream.iterate(0, n -> n + 1)
    .limit(6)
    .skip(2)
    .forEach(System.out::println);

输出

    2
    3
    4
    5

2. 映射

输出:

  h
  e
  l
  l
  o
  j
  a
  v
  a
  8

参考

上一篇 下一篇

猜你喜欢

热点阅读