Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >逆序排序遇到`Not-static method cannot be referenced from a static context`

逆序排序遇到`Not-static method cannot be referenced from a static context`

作者头像
十毛
发布于 2019-05-14 07:01:34
发布于 2019-05-14 07:01:34
2K00
代码可运行
举报
运行总次数:0
代码可运行

逆序排序中的方法引用

问题

在Stream API中或其他排序方法中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LinkedHashMap<String, Long> sortedKeywords = keywordCount.entrySet().stream()
        .sorted(Comparator.comparingLong(Map.Entry::getValue).reversed())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new));

IDEA会提示错误:Not-static method cannot be referenced from a static context

问题说明

  • stream中的顺序排列 使用Comparator.comparingLong(Map.Entry::getValue)完成顺序排列
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 正序排序没有任何问题
LinkedHashMap<String, Long> sortedKeywords = keywordCount.entrySet().stream()
        .sorted(Comparator.comparingLong(Map.Entry::getValue))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new));
  • 逆序排列 Comparator.comparingLong(Map.Entry::getValue).reversed()则会出现错误提示Not-static method cannot be referenced from a static context
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 逆序排序就会IDEA就会提示编译错误:`Not-static method cannot be referenced from a static context`
LinkedHashMap<String, Long> sortedKeywords = keywordCount.entrySet().stream()
        .sorted(Comparator.comparingLong(Map.Entry::getValue).reversed())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new));

上面这个提示是有误导性质的,实际上是因为Java无法推断类型,所以只要明确类型信息就可以(这一点确实很奇怪,因为在我们看来,类型信息明明是已经存在的。而且使用别的类型,IDEA也会报错,也侧面证明,类型信息确实可以推断出来。进一步的问题排查还需要了解更多Java的类型推断

  • 编译还会生成如下错误信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project tenbot: Compilation failure: Compilation failure:
[ERROR] /E:/Workspace/tenbot/src/main/java/com/tencent/iask/tenbot/util/HanLpUtil.java:[38,49] 不兼容的类型: 无法推断类型变量 T
[ERROR]     (参数不匹配; 方法引用无效
[ERROR]       无法将 接口 java.util.Map.Entry<K,V>中的 方法 getValue应用到给定类型
[ERROR]         需要: 没有参数
[ERROR]         找到: java.lang.Object
[ERROR]         原因: 实际参数列表和形式参数列表长度不同)
[ERROR] /E:/Workspace/tenbot/src/main/java/com/tencent/iask/tenbot/util/HanLpUtil.java:[38,53] 方法引用无效
[ERROR]   无法从静态上下文中引用非静态 方法 getValue()
  • 修复错误:增加类型信息 Comparator.comparingLong(Map.Entry<String, Long>::getValue).reversed()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LinkedHashMap<String, Long> sortedKeywords = keywordCount.entrySet().stream()
        .sorted(Comparator.comparingLong(Map.Entry<String, Long>::getValue).reversed())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new));

问题解释

这里实际上是Java的类型推断的问题,不过跟javac的一个bug混淆了,就生成这么一个有误导性质的错误提示。如果是在Java 9中则会提示参数不匹配; 方法引用无效

ps: 为什么会存在类型推断错误?思考了半天也没弄明白,希望高人解答

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.05.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【后端】告别繁琐排序!Java Stream API 一站式解决方案
掌握这些 Stream 排序技巧后,你会发现处理各种排序需求就像搭积木一样简单有趣!🎯
框架师
2025/02/28
1720
又双叒叕一行代码:Map按值排序
在分段随机实践—模拟线上流量一文中,我将流量模型统计成为一个个Map<F, Integer>形式数据保存起来。
FunTester
2021/07/23
8870
Java8新特性stream流
Java8新特性stream流 一、包装数据类型 @Test public void main22() { List<Integer> list = new ArrayList<Integer>(){{ add(7); add(5); add(1); add(2); add(8); add(4); add(3); add(6); add(3); add(6); add(3); add(6); }}; // 过滤 List<Int
半月无霜
2023/03/03
4800
Map按单个或多个Value排序,当Value相同时按Key排序
Map可以先按照value进行排序,然后按照key进行排序。 或者先按照key进行排序,然后按照value进行排序,这都是可以的。
向着百万年薪努力的小赵
2023/01/10
2.6K0
如何使用Java8 Stream API对Map按键或值进行排序
在这篇文章中,您将学习如何使用Java对Map进行排序。前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题。所以我决定写这样一篇文章。在Java中,有多种方法可以对Map进行排序,但是我们将重点介绍Java 8 Stream,这是实现目标的一种非常优雅的方法。
字母哥博客
2020/09/23
7.3K0
如何使用Java8 Stream API对Map按键或值进行排序
Java Map按值排序的正确姿势
1、 Java 8 – Sorting HashMap by values in ascending and descending order
明明如月学长
2021/08/27
3.6K0
Java8合并两个Map中元素的正确姿势
英文原文地址:https://www.baeldung.com/java-merge-maps
明明如月学长
2021/08/27
7.5K0
不要再写这样的神级代码了!
JDK8提供的Stream虽然好用,Lambda虽然简洁,但一定不能滥用,我举一个实际遇到的例子(已做脱敏处理):
用户1148394
2020/03/23
5430
不要再写这样的神级代码了!
java8 Lambda Stream collect Collectors 常用实例
字典查询和数据转换 toMap时,如果value为null,会报空指针异常 解决办法一:
Erwin
2019/12/31
3.8K0
你锁不了解的增强 Map 集合
在 Jdk 8 中 Map 接口提供了一些新的便利的方法。因为在本文中我所提到的所有 Map 方法都是以默认值方法的方式实现的,所以现有的 Map 接口的实现可以直接拥有这些在默认值方法中定义的默认行为,而不需要新增一行代码。本文涵盖的 Jdk 8 中引进的 Map 方法有:getOrDefault(Object, V),putIfAbsent(K, V),remove(Object, Object),replace(K, V),andreplace(K, V, V)。
BUG弄潮儿
2021/08/13
2510
java.util.Map API
Map集合是有Key和Value的,Collection集合是只有Value。Collection集合底层也是有Key和Value,只是隐藏起来。
HLee
2021/02/08
7260
java.util.Map API
LeetCode38|根据字符出现频率排序
键值对集合的使用,不过也使用了java8的一些语法,这里的代码是不是看着都简洁了很多,可能会有人说可读性不友好,相信你熟练使用java8的语法时,这看着还是比较好的。
码农王同学
2020/08/25
2750
LeetCode38|根据字符出现频率排序
常用Lamda表达式
我们在使用lamda表达式排序的时候,很多时候考虑到空指针可能会选择传统的方式,lamda实际上也有防止空指针的排序。
全栈程序员站长
2022/06/30
2860
常用Lamda表达式
蓝桥杯-数位排序
  小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
别团等shy哥发育
2023/03/04
3500
蓝桥杯-数位排序
lambda
List<BigDecimal> lis = new ArrayList<BigDecimal>();
用户6019926
2024/01/04
1120
如何利用java8的Stream,把jsonobject变成有层级关系的数据结构
使用Java 8的Stream API来将JSONObject转换为具有层次结构的数据结构,需要经过以下步骤:
用户1289394
2023/08/22
5920
如何利用java8的Stream,把jsonobject变成有层级关系的数据结构
Stream流
通过Files.lines方法将文本文件转换为管道流,下图中的Paths.get()方法作用就是获取文件,是Java NIO的API!
大忽悠爱学习
2022/05/06
3.9K0
Stream流
java map 转string_java-将Map <String,Object>转换为Map <String,String>
Map map = new HashMap(); //Object is containing String
全栈程序员站长
2022/08/25
12.4K0
Java8用起来,你的代码将会简化很多
Java8已经诞生好几年了,但我相信很多小伙伴并不熟悉Java8的特性,并将这些特性使用到工作中去。下面介绍一些我使用Java8的一些经验,真的将我的代码简化了很多。
Lvshen
2022/05/05
6030
Java8用起来,你的代码将会简化很多
JDK 都27岁了,你还在用for循环遍历list吗?
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
搜云库技术团队
2023/03/15
7150
JDK 都27岁了,你还在用for循环遍历list吗?
相关推荐
【后端】告别繁琐排序!Java Stream API 一站式解决方案
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验