您的位置:

如何利用Java 8的.stream()方法获取最大值

一、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对象获取最大值是一种很常见的操作,也是代码优化的一个好方式。