Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从日期列表中获取平均值_Java_Java 8 - Fatal编程技术网

Java 从日期列表中获取平均值

Java 从日期列表中获取平均值,java,java-8,Java,Java 8,我有一个日期对象列表,希望从该列表中获取平均值。有没有一种简单的方法可以使用lambda表达式实现这一点 例如,如果我的列表包含两个日期: 01/01/2017 31/01/2017 结果将是: 15/01/2017 解决方案 如果在日期类型中执行getTime,则自1970年1月1日00:00:00 GMT以来的日期以毫秒为单位,对每个日期执行getTime,将所有毫秒相加,然后除以数组的长度。然后以您的号码为例:1495201767023,现在创建一个新日期。Date Date=新日期

我有一个日期对象列表,希望从该列表中获取平均值。有没有一种简单的方法可以使用lambda表达式实现这一点

例如,如果我的列表包含两个日期:

01/01/2017

31/01/2017
结果将是:

15/01/2017
解决方案 如果在日期类型中执行getTime,则自1970年1月1日00:00:00 GMT以来的日期以毫秒为单位,对每个日期执行getTime,将所有毫秒相加,然后除以数组的长度。然后以您的号码为例:1495201767023,现在创建一个新日期。Date Date=新日期1495201767023L别忘了它应该起作用的L


正如在评论中所说,处理这么长的时间可能会导致溢出。因此,如果您的日期在一个列表中,并且java8是一个选项,请尝试除以常量或进行递增平均值

long ave = (long) myList.stream()
                    .mapToLong(Date::getTime)
                    .average()
                    .getAsDouble();
System.out.println(new Date(ave));
使用Java时间API

List<LocalDate> myList = new ArrayList<>();
myList.add(LocalDate.of(2017, 01, 01));
myList.add(LocalDate.of(2017, 01, 31));
myList.forEach(System.out::println);

long ave = (long) myList.stream()
            .mapToLong(x -> x.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli())
            .average()
            .getAsDouble();
System.out.println(new Date(ave));
输出:

2017年1月16日星期一00:00:00 CET


加上许多日期可能导致溢出,毫秒将是非常长的数字。或者将它们除以常数,精度较低,但不重要,因为毫秒无论如何都是非常精确的,或者一次只加两个,然后逐渐取平均值。没想到这一点,但也不是一个坏点,感谢刚刚计算的精度。6168647添加后溢出。谢谢各位,我认为这与评论中标记的QA的想法相同。我在上面发布的示例中尝试了这一点,不幸的是,它给了我2017年1月1日的答案。请验证我的答案好吗?
List<LocalDate> myList = new ArrayList<>();
myList.add(LocalDate.of(2017, 01, 01));
myList.add(LocalDate.of(2017, 01, 31));
myList.forEach(System.out::println);

long ave = (long) myList.stream()
            .mapToLong(x -> x.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli())
            .average()
            .getAsDouble();
System.out.println(new Date(ave));