java—打印arraylist特定字段的平均值,但按另一个字段筛选

lx0bsm1f  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(278)

所以我有一辆普通车,有大小和长度的变量。我创建了一个用于存储汽车对象的arraylist。我想使用一个java流来使用lambda表达式按大小过滤列表,但是只计算每个cars的平均长度。所以在下面的代码中,我想得到尺寸大于10但小于30的汽车的平均长度。
我看过其他关于如何平均整数数组列表的帖子,但这是一个包含整数的对象列表,我无法得到任何输出,任何建议都非常感谢。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import java.util.List;

public class Car {

        int size;
        int length;

        public Car (int s, int l) {
            size = s;
            length = l;
        }

        public int getSize() {
            return size;
        }

        public int getLength() {
            return length;
        }

    public static void main(String[]args) {
        ArrayList<Car> list = new ArrayList<Car>();
        Car t1 = new Car(1,5);
        Car t2 = new Car(8,6);
        Car t3 = new Car(12,9);
        Car t4 = new Car(25,12);

        list.add(t1);
        list.add(t2);
        list.add(t3);
        list.add(t4);

         int info = list.stream()
        .filter(l -> l.getSize() > 10 && l.getSize() <30 )
        .average(Car.getLength);

            }

}
bogh5gae

bogh5gae1#

此上下文中的“.average()”终端/聚合操作用于intstream类。
所以,与其打电话 .average(Car.getLength) (不管怎样,这对于方法引用来说是不正确的语法,假设这就是您想要的),您需要如下内容:

OptionalDouble average = list.stream()
.filter(l -> l.getSize() > 10 && l.getSize() < 30)
.mapToInt(Car::getLength)
.average();

int avg;

if (average.isPresent(){
   avg = (int) average.getAsDouble();
   System.out.println(avg);
}

这样,一旦.average()操作被命中,intstream就会正确地命中它
如何处理平均值不存在的情况(例如,原始流列表为空)取决于您。我没有初始化avg变量,因为我假设您只需要在该条件下打印它,但是如果您稍后需要它,您将需要实际初始化它。
https://docs.oracle.com/javase/8/docs/api/java/util/stream/intstream.html
使用平均运算的一些示例:https://www.geeksforgeeks.org/intstream-average-in-java-with-examples/

相关问题