【问题标题】:Print average of specific field of arraylist, but filter by another field打印arraylist特定字段的平均值,但按另一个字段过滤
【发布时间】:2020-12-19 00:00:22
【问题描述】:

所以我有一辆具有大小和长度变量的类车。 我创建了一个用于存储汽车对象的数组列表。 我想使用 java 流使用 lambda 表达式按大小过滤列表,然后只计算每辆车长度的平均值。 因此,在下面的代码中,我想获得尺寸大于 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);
        
            }

}

【问题讨论】:

  • 您希望代码的哪一部分 print 什么?
  • 我建议你调查Stream#mapToInt()——这应该会让你找到ints的集合。
  • 好的,谢谢吉姆检查一下
  • PM 77-1 我希望 .average 打印输出

标签: java lambda java-stream


【解决方案1】:

此上下文中的“.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/

【讨论】:

  • 嘿,感谢您的输入,我尝试了您的代码,但收到以下错误类型不匹配:无法从 OptionalDouble 转换为 int,我尝试了双平均而不是 int 平均并将 mapToInt 更改为 mapToDouble 但没有运气
  • @Stopdownvotingfornoreason 抱歉,我已更新答案以说明 OptionalDouble 的返回类型。我继续将 avg int 初始化为 -1,作为在初始化 int 的情况下您的偏好的占位符,然后在条件中实际设置值。
  • 我只想说现在完美无缺,谢谢一百万,你是救命的伙伴。
  • 我很高兴,我最终删除了 avg 变量的初始化,并添加了我的解释。想我只是在此处添加此内容以添加上下文,以说明为什么我的第一条评论的那部分不再相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多