.stream().max 写法
时间: 2023-07-22 18:28:57 浏览: 144
这是一个Java 8中的流操作,可以使用Lambda表达式或方法引用来实现。下面是一个使用Lambda表达式的例子:
```
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> max = list.stream().max((a, b) -> a.compareTo(b));
```
这个例子中,我们创建了一个包含整数的列表,并通过调用stream()方法创建了一个流。然后,我们使用max()方法和一个Lambda表达式来获取列表中的最大元素。在Lambda表达式中,我们使用a.compareTo(b)方法来比较两个整数的大小,并返回较大的那个。
你也可以使用方法引用来实现,例如:
```
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> max = list.stream().max(Integer::compareTo);
```
这个例子中,我们使用Integer类的compareTo()方法来比较两个整数的大小,并将其作为方法引用传递给max()方法。
相关问题
List中有个Student 用java的流式写法中的max取出生日最大的Student对象
在Java中,如果你想利用Stream API找出List<Student>中最年长的学生(即生日最大),可以这样做:
```java
import java.time.LocalDate;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class Student {
private String name;
private LocalDate birthday;
// 构造函数、getter和setter...
public static void main(String[] args) {
List<Student> students = ... // 初始化学生列表
Optional<Student> oldestStudent = students.stream()
.max(Comparator.comparing(Student::getBirthday)); // 按照生日比较
if (oldestStudent.isPresent()) {
System.out.println("最年长的学生是:" + oldestStudent.get().getName());
} else {
System.out.println("学生列表为空");
}
}
}
```
这里我们使用了`max()`函数,传入的是一个比较器`Comparator.comparing(Student::getBirthday)`,它告诉Stream如何根据每个Student对象的`birthday`属性来进行排序。如果列表非空,`max()`会返回一个Optional对象,其中包含年龄最大的Student实例;如果列表为空,则`isPresent()`会返回false。
用java8写法优化
好的,你可以使用Java 8的Optional类来实现这个功能,代码如下:
```
Optional<Integer> maxOrder = Optional.ofNullable(sysTokenIterationTops)
.map(List::stream)
.orElseGet(Stream::empty)
.map(SysTokenIterationTop::getFdTopOrder)
.filter(Objects::nonNull)
.max(Integer::compareTo);
if (maxOrder.isPresent()) {
Integer max = maxOrder.get();
// do something with max
}
```
首先使用`Optional.ofNullable()`方法来判断`sysTokenIterationTops`是否为`null`,如果为`null`则返回一个空的`Optional`对象。接着使用`map()`方法将`List`对象转换为`Stream`对象,如果`List`对象为`null`则返回一个空的`Stream`对象。然后使用`map()`方法将`SysTokenIterationTop`对象转换为其`fdTopOrder`属性值,使用`filter()`方法过滤掉为`null`的元素,最后使用`max()`方法获取最大值。最终返回的是一个`Optional`对象,判断是否存在最大值并获取最大值的操作与之前的方法相同。
需要注意的是,当`sysTokenIterationTops`为`null`或空时,使用这种方式获取的最大值为`Optional.empty()`。如果需要返回`null`值,可以在获取最大值时使用`orElse(null)`方法,代码如下:
```
Integer maxOrder = Optional.ofNullable(sysTokenIterationTops)
.map(List::stream)
.orElseGet(Stream::empty)
.map(SysTokenIterationTop::getFdTopOrder)
.filter(Objects::nonNull)
.max(Integer::compareTo)
.orElse(null);
if (maxOrder != null) {
// do something with maxOrder
}
```
其中`isPresent()`方法用于判断是否存在最大值,`get()`方法用于获取最大值。
阅读全文