一、Stream简介
在Java 8中,引入了一个新的特性Stream,它是对集合(Collection)对象功能的增强。Stream 的 API 能让你以一种声明的方式处理数据,毫不夸张地说,Stream API 是Java 8最令人期待的改变之一,它位于java.util.stream包中。Stream操作分为三个阶段:创建流、通过中间操作开展业务处理逻辑、终结流处理。
二、使用stream的基本语法
Java 8中,Collection接口被扩展,提供了两个方法来生成Stream流:
/**
* 常规方式构造Stream
*/
List
list = Arrays.asList("a", "b", "c");
Stream
stream = list.stream();
/**
* 静态方法构造Stream
*/
Stream
stream = Stream.of("a", "b", "c");
通过上述方式,我们成功地生成了一个Stream对象。紧接着,我们可以对该Stream对象进行各种操作,比如获取最大值,在线处理等。
三、获取Stream中的最大值
使用Java 8的Stream对象获取集合中的最大值,我们需要了解几个API方法。其中,我们常用到的有max()方法和comparingXXX()方法。
public static <T> Optional<T> max(Comparator<? super T> comparator)
// Returns the maximum element of this stream according to the provided Comparator.
public static <T> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)
max()方法参数为一个实现了Comparator接口的对象,即元素的比较器。它返回Optional<T>对象,我们可以通过get()方法获取对应的结果,也可以使用orElse()方法作为默认结果。
comparingXXX()方法是用于生成比较器的静态工厂方法。例如,comparingInt()方法用于比较整数,comparingDouble()方法用于比较浮点数。要注意的是,我们在使用comparingXXX()方法时,需要传入一个函数式接口,用于获取元素进行比较的Key
下面是针对List集合中元素为Integer类型,求最大值的代码:
List<Integer> list = Arrays.asList(1, 5, 3, 7, 9);
Optional<Integer> max = list.stream().max(Integer::compareTo);
System.out.println(max.orElse(-1));
在上述代码中,我们传入的函数式接口为Integer::compareTo。
四、使用Stream对象获取最大元素的实例
假设在List集合中有很多Person对象,每个Person都有一个age属性,我们希望通过Stream对象获取年龄最大的那个Person实例,需要要怎么做呢?
class Person {
private String name;
private int age;
// getter and setter
}
// 构造Person集合
List<Person> people = Arrays.asList(
new Person("Tom", 18),
new Person("Jerry", 22),
new Person("Lily", 25),
new Person("Lucy", 19)
);
// 通过Stream对象获取年龄最大的Person实例
Optional<Person> personOptional = people.stream()
.max(Comparator.comparingInt(Person::getAge));
Person person = personOptional.orElse(null);
System.out.println(person.getName() + ":" + person.getAge());
在这段代码中,我们首先定义了一个Person类,包含name和age属性。随后,我们构造一个Person列表,通过Stream对象并调用max()方法获取年龄最大的Person实例,comparingInt()函数式接口用于指定按照何种方式进行比较。最终,我们获取了年龄最大的Person实例并打印了其姓名和年龄。
五、终结语
Java 8的Stream API提供了非常多的方法,常用的有filter、map、forEach、reduce、sorted等方法,这些方法都是为了让开发者更便捷地对集合对象进行处理。而在处理集合对象的过程中,获取到最大值是一项常见的需求,使用Stream对象获取最大值是一种很常见的操作,也是代码优化的一个好方式。