Stream和Optional
Stream流
- Stream API ( java.util.stream) 把函数式编程风格引入到Java中。这是目前为止对Java类库最好的补充,因为Stream API可以极大提供Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
- Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
Stream定义
是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,Stream讲的是计算!”
注意:
- Stream 自己不会存储元素。
- Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
- Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行
Stream的创建
public class TestStream {
public static void main(String[] args) {
//1 通过Collection接口的子类对象的方法
List<String> list = Arrays.asList("a","b","c","d","e");
Stream<String> stream = list.stream();
//2 通过Arrays的stream方法得到流
String [] arr = {"a","b","c","d","e"};
Stream<String> stream1 = Arrays.stream(arr);
//3 通过Stream接口的静态方法
Stream<String> abc = Stream.of("abc", "xyz");
}
}
Stream的一些方法
Person类
public class Person {
private int id;
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return id == person.id &&
age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name, age);
}
public Person() {
}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
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 class TestStream2 {
public static void main(String[] args) {
Person p1 = new Person(1,"a",20);
Person p2 = new Person(2,"b",21);
Person p3 = new Person(1,"a",20);
Person p4 = new Person(4,"d",19);
Person p5 = new Person(5,"e",18);
Person p6 = new Person(6,"f",17);
Person p7 = new Person(7,"g",25);
//1 通过Stream接口的静态方法
Stream<Person> stream = Stream.of(p1,p2,p3,p4,p5,p6,p7);
//遍历forEach输出
System.out.println("*********stream.forEach 遍历输出************");
stream.forEach(System.out::println);
System.out.println("*********stream.distinct去重,要重写perosn的equas和hashcode方法************");
stream.distinct().forEach(System.out::println);
System.out.println("*********stream.sorted 排序************");
stream.sorted(Comparator.comparing(Person::getAge)).forEach(System.out::println);
System.out.println("*********stream.filter过滤************");
stream.sorted(Comparator.comparing(Person::getAge)).filter((p)->p.getAge()>20).forEach(System.out::println);
System.out.println("*********stream.limit截断************");
stream.sorted(Comparator.comparing(Person::getAge)).filter((p)->p.getAge()>20).limit(1).forEach(System.out::println);
//统计计算的方法
//最大值 最小值 求和 平均值
IntSummaryStatistics intSummaryStatistics = stream.mapToInt(p -> p.getAge()).summaryStatistics();
// //输出看看
//IntSummaryStatistics{count=7, sum=140, min=17, average=20.000000, max=25}
System.out.println(intSummaryStatistics);
System.out.println(intSummaryStatistics.getCount());
System.out.println(intSummaryStatistics.getSum());
System.out.println(intSummaryStatistics.getMin());
System.out.println(intSummaryStatistics.getAverage());
System.out.println(intSummaryStatistics.getMax());
Optional<Person> first = stream.findFirst();
// //拿到的一个Optional对象
System.out.println(first);
System.out.println(first instanceof Optional);
// //拿到person
System.out.println(first.get());
//筛选 ,字母转换功能
List<String> collect = stream.map(p -> p.getName().toUpperCase()).collect(Collectors.toList());
System.out.println(collect);
}
}
Optional类
-
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
-
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
-
Optional 类的引入很好的解决空指针异常。
-
Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
Optional的常用方法
- Optional.empty() : 创建一个空的 Optional 实例
- Optional.of(T t) : 创建一个 Optional 实例
- Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
- isPresent() : 判断是否包含值
- T get(): 如果调用对象包含值,返回该值,否则抛异常
- orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
- orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
- map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
- flatMap(Function mapper):与 map 类似,要求返回值必须是Optional