关于Java1.8新特性学习使用

引言:最近在学习Java1.8的一些新特性,这些新特性主要包括以下三点:

1,lambda表达式; 2,流处理; 3;函数式接口

我们依次来学习这三点。

lambda表达式

其实Lambda表达式的本质只是一个“语法糖”(语法糖Syntactic Sugar 糖衣语法,方便开发人员使用,JVM并不识别,
会在编译阶段解语法糖,还原为基础语法),由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码
来实现同样的功能。虽然在写代码的时候可以帮助我们快速完成代码,但是也会给别人后期维护代码带来一定的困 扰,所以慎用。

Lambda表达式的语法
基本语法: (parameters) -> expression 或 (parameters) ->{ statements; }
先构造一个list数组,然后打印出数组每个元素:

String [] str = {"rwe","qwerq","Qwerqw","qwer"};
List<String> list = Arrays.asList(str);

第一种打印方式:

for (String value : list) {
System.out.println(value);
}

第二种打印方式:

list.forEach(s ‐> System.out.println(s));

第三种打印方式:

list.forEach(System.out::println);

第一种是原始Java写法,第二种和第三种则都是lambda表达式形式。可以看出lambda表达式在简化代码方面确实
很不错,但是也可能对部分人员带来困扰,代码变得不那么易懂了,比如第三种方式猛地一看就可能有点迷糊。

流处理

首先要澄清的是 java8 中的 Stream 与 I/O 流 InputStream 和 OutputStream 是完全不同的概念。 Stream 机制是
针对集合迭代器的增强。流允许你用声明式的方式处理数据集合(通过查询语句来表达,而不是临时编写一个实
现)。
创建对象流的三种方式:
由集合对象创建流。对支持流处理的对象调用 stream()。支持流处理的对象包括 Collection 集合及其子类

List<Integer> list = Arrays.asList(1,2,3);
Stream<Integer> stream = list.stream();

由数组创建流。通过静态方法 Arrays.stream() 将数组转化为流(Stream)

IntStream stream = Arrays.stream(new int[]{3, 2, 1});

通过静态方法 Stream.of() ,但是底层其实还是调用 Arrays.stream()

Stream<Integer> stream = Stream.of(1, 2, 3);

注意: 还有两种比较特殊的流
空流:Stream.empty()
无限流:Stream.generate()Stream.iterate()。可以配合 limit() 使用可以限制一下数量
// 接受一个 Supplier 作为参数

Stream.generate(Math::random).limit(10).forEach(System.out::println);

// 初始值是 0,新值是前一个元素值 + 2

Stream.iterate(0, n ‐> n + 2).limit(10).forEach(System.out::println);

流处理的特性

  1. 不存储数据
  2. 不会改变数据源
  3. 不可以重复使用

函数式接口*

函数式接口指仅包含一个抽象方法的接口。java.lang.Runnable、java.util.Comparator是典型的函数式接口。

函数式接口和Lambda表达式的联系
Lambda表达式需要一个函数式接口作为其对应类型,而它的方法体就是函数接口的实现。每一个该接口类型的
Lambda表达式都会被匹配到该接口的抽象方法。

函数式接口的对象怎么创建
使用Lambda表达式创建。(可以简化代码)

/*Lambda表达式创建函数式接口的对象*/
interface Converter{
Integer convert(String from);
}
Converter converter=(from)>Integer.valueOf(from);
Integer integer=converter.convert("123");

上面的代码中,编译器知道Converter只有一个方法convert(),所以convert()方法肯定对应表达式(from)->Integer.valueOf(from);由于convert()只有一个参数,所以from一定是String类型的。

新特性——接口的默认方法(default)

1、 接口的默认方法是为了解决接口演化问题,即新版本中对接口进行修改,会导致早期版本的代码无法运行。因
为接口中的方法必须被实现,若在接口中添加新方法,可能进行大量重构。所以,若往一个接口中添加新的方法,
可以提供该方法的默认实现。

2、有了默认方法,对已有的接口使用者来说,代码可以继续运行。新的代码可以继续使用该方法,也可以重写默
认的实现。

interface Formula{
double calculate(int a);
/*新增的方法,提供一个默认实现*/
default double sqrt (int a) {
return Math.sqrt(s);
}
}

下面附一个我最近使用这些特性写的一个排序代码:

List<Map> param = list;
return param.stream().sorted(Comparator.comparing(map ‐>
Integer.parseInt(map.get(firstKey).toString()))).collect(Collectors.toList());
posted @ 2021-08-07 16:49  昨夜风雨声  阅读(16)  评论(0编辑  收藏  举报  来源