Java 8 Stream——聚合和返回聚合步骤

标签 java java-8 java-stream

我是 java 8 stream api 的新手,我正在寻找一种解决方案来运行我的对象列表并聚合某些属性,以便最终能够获得该属性类型的新列表和所有聚合结果。

例如我的列表中有 10 个人物,我想要一个基于第一人称年龄的所有年龄差异的列表

即使在 java 中也可以使用流吗?

例如:

person1.age = 10
person2.age = 12
person3.age = 20
person4.age = 25
person5.age = 30

在执行流魔术之后,结果应该是 int 类型并且看起来像这样

0
2 //based on first age 12 - 10
10 // based on first age 20 - 10
15 // ...
20

最佳答案

我假设您有一个名为 Person 的类,上面有一个 getAge() getter。然后你可以这样做:

list.stream()
    .skip(1)
    .map(Person::getAge)
    .map(age -> age - list.get(0).getAge())
    .map(Math::abs)
    .forEach(System.out::println);

.skip(1) - 从列表中跳过第一个人,因此结果不会包含通过比较第一个人的年龄与他们自己的年龄而产生的 0。

.map(Math::abs) - 取绝对值,因为“差异”始终为正(无论我有 10 年而你有 20 年,还是我有 20 年而你有 10 年,相差 10)。

您可能想要添加 .distinct() 以删除重复项。

最后,您可能想要使用不同的终端操作 - 例如.collect(toList()),而不是打印。

关于Java 8 Stream——聚合和返回聚合步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42625711/

相关文章:

java-8 - Java 8 将列表转换为映射处理重复键和操作值

java - 当特定 Spring 配置文件处于 Activity 状态时,如何防止运行测试?

java - 为什么响应式(Reactive)编程取代了观察者模式

java - 这是一个虚假的唤醒还是只是一个时髦的(非虚假的)竞争条件?

java - 在 Java 8 中禁用 TLS 1.0

elasticsearch - Elastic Search 6.x不断失败

java - 更改 forEach 循环中变量的值 java 8

带状态的 Java Streams - 一个简单的练习

java - 将参数从 Activity.onCreate 传递到其他方法

java - 如何递归地 flatMap 一个流?