Stream流API以及语法新特性

Stream的特点

  1. 用于计算,不会存储数据
  2. Stream不会改变源数据
  3. 计算操作是延时执行的,直到需要结果时才会执行

Stream的使用基本步骤

  1. 创建Stream流对象
  2. 执行中间操作(延时执行的操作)
  3. 执行终止操作(需要结果的操作)

创建Stream的方式:

  • 通过集合创建: list.stream()
  • 通过Arrays.stream()
  • 使用Stream.of()方法
  • 使用Stream.generate()方法

流的中间操作

常用操作:

  • filter(Lambda)过滤
  • distinct()去重
  • limit(long maxSize):截断流
  • skip(long n):跳过前n个
  • peek(Consumer action):对流中的每个数据执行某操作
  • sorted():排序
  • map(): 对每个数据映射成另一个数据
  • flatMap():对每个元素作某个操作后再连接到一起
@Test
public void test(){
	List<String> list = new ArrayList<>();
	list.add("java");
	list.add("hello");
	list.add("abc");
	list.add("abc");

	Stream<String> stream = list.stream();
	stream.filter(e -> e.length() < 4).forEach(System.out::println);
}

流的终止操作

终止之后, stream流将关闭,无法继续进行中间操作。
常用的终止操作有:

  • allMatch(判断接口):检查是否匹配所有元素
  • anyMatch(判断接口):检查是否至少匹配一个元素
  • noneMatch(判断接口):检查是否没有一个满足
  • findFirst():返回第一个元素
  • findAny():返回当前流的任意元素
  • count():返回流中元素总数
  • max(比较器):返回最大值
  • min(比较器):返回最小值
  • forEach():遍历
  • reduce(): 可以将流中元素反复结合起来,得到一个值
  • collect(Collector.toList()): 将流转换为其他形式

Optional处理空指针异常

原先只能使用非空判断来阻止空指针异常,但是如果类的成员变量里面有很多引用类型,然后引用类型里面也有引用类型,会导致一个非空判断需要写很多次,而且容易遗漏。

使用Optional可以解决该问题:

getCity(Person p){
	Optional<Person> optional = Optional.ofNullable(p);
	Optional<Address> address = optional.map(Person::getAddress);
	String city = address.map(City::getCity).orElse("没有城市信息");
	return city;
}

switch语法新特性

  • 需要穿透时可以将关键词使用逗号分隔
  • 冒号可以用->代替,并且不用写break了
  • switch可以使用yield来返回处理后的结果

instanceof新特性

将判断和强制类型转换合并在一起:if(a instanceof Cat c){}

Record类

是一个常量final类,自动生成属性和获取属性的方法。以及hashCode和equals方法。不能修改类中的属性。

public record Person(String name, int age){}

你可能感兴趣的:(java)