问题描述: 使用Java8 Stream对数组进行排序

list.stream().sorted(Comparator.comparing(SeriesData::getName));
复制代码

其中sorted()函数需要传入一个Comparator,而我们使用了Comparator中的静态方法comparing()构建了一个Comparator。在构建Comparator的时候comparing()需要传入一个函数的引用作为参数,也就是SeriesData::getName

SeriesData类如下:

public class SeriesData {private Object name;public void setName(Object name) {this.name = name;}public Object getName() {return name;}
}
复制代码

这时出现两个错误:

Error:(343, 86) java: no suitable method found for comparing(SeriesData::getName)method java.util.Comparator.<T,U>comparing(java.util.function.Function<? super T,? extends U>,java.util.Comparator<? super U>) is not applicable(cannot infer type-variable(s) T,U(actual and formal argument lists differ in length))method java.util.Comparator.<T,U>comparing(java.util.function.Function<? super T,? extends U>) is not applicable(inferred type does not conform to upper bound(s)inferred: java.lang.Objectupper bound(s): java.lang.Comparable<? super java.lang.Object>,java.lang.Object)
复制代码
Error:(343, 97) java: invalid method referencenon-static method getName() cannot be referenced from a static context
复制代码

Q1

第一个错误就是说,向comparing()方法中传入的参数类型是错的。为什么是错的呢? 首先先来看看comparing()这个函数的实现:

public static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor) {Objects.requireNonNull(keyExtractor);return (Comparator<T> & Serializable)(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
复制代码

第一眼:WTF!,这是什么鬼,根本看不懂啊,那就赶紧好好补补课!

  1. 首先这是一个静态方法,其次,这是泛型方法。

  2. static后面的<T, U extends Comparable<? super U>>,这是泛型方法的泛型参数声明部分,意思是:方法中有一种没有任何限制的参数类型T,另一种参数是实现了Comparable<? super U>接口的类U

  3. comparing()方法接受一个参数:Function<? super T, ? extends U> keyExtractor,这是一个函数引用,所引用的函数需要传入一个参数T,并返回一个U或他的子类。

这是要注意U是如何限定的:实现了Comparable<? super U>接口的类

而在上面的程序中的引用方法SeriesData::getName,返回的是Object,很遗憾它没有实现Comparable接口,所以也就出现了第一个错误。

Q2

第二个错误看似很好理解:“静态上下文中无法引用非静态方法无法”,getName是一个非静态的方法,而comparing()则是静态的,这导致问题无可厚非。But,很怪异的是,当我把getName的返回值改为String后就不会出现上述的问题了,找了好久没找到原因。

另外,也尝试了其他例子,只要是在静态方式中使用非静态方法都会出现“non-static method cannot be referenced”这个错误。

public static Integer fun2(String a) {System.out.println(a);return Integer.valueOf(a);
}public static void fun1(Function<String, Integer> ac) {Stream.of("1", "2", "4").map(x -> ac.apply("1"));
}public static void main(String[] args) {fun1(StorageAreaAction::fun2);
}
复制代码

如果把fun2()中的static去掉则会报错。

猜测: 难道是因为setter方法的原因?

如果有哪位大神知道的话还请不吝赐教。

Continuing...

Java8 Stream()引发的“non-static method cannot be referenced from a static context”相关推荐

  1. 【错误】Non-static method*** cannot be referenced from a static

    错误:Non-static method*** cannot be referenced from a static context 造成原因:实例化对象后,没有通过对象调用方法. *解决方法1:直接 ...

  2. MyBatisPlus Non-static method cannot be referenced from a static context

    在使用 LambdaQueryWrapper 构建查询参数的时候,提示 Non-static method cannot be referenced from a static context // ...

  3. Non-static method ‘*‘ cannot be referenced from a static context 错误分析

    字面意思是无法从静态上下文引用非静态方法 报错图片和信息 后来发现直接使用类去调类中的方法,但是方法并非静态方法 是无法使用类去调取的. 解决方案: 1.将方法设置成静态方法 2.注入类 使用实例调用 ...

  4. Java8 stream().map()将对象转换为其他对象

    Java8 stream().map()将对象转换为其他对象 1: 将对象List转为List public class user{private String name;private String ...

  5. Java8 Stream用法总结

    Java8 Stream Stream 总览 什么是流 流的构成 流的构造与转换 构造流的几种常见方法 流转换为其它数据结构 中间操作符 map mapToInt mapToLong.mapToDou ...

  6. Java8 Stream性能如何及评测工具推荐

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作为技术人员,学习新知识是基本功课.有些知识是不得不学,有些知识是学了之后如虎添翼,Java ...

  7. JAVA8 Stream方法使用详解reduce、IntStream(二)

    文章目录 一 归约 1.元素求和 2.最大值和最小值 二.数值流 1.映射数值流 2.转换对象流 3.数值范围 三.构建流 1.由值创建流 2.由数组创建流 3.由文件生成流 4.由函数生成流 此章节 ...

  8. 怎么break java8 stream的foreach

    文章目录 简介 使用Spliterator 自定义forEach方法 总结 怎么break java8 stream的foreach 简介 我们通常需要在java stream中遍历处理里面的数据,其 ...

  9. java8 stream案例分析

    java8 stream Stream是java8 推出的一个处理集合类的一个全新的接口,在工作当中经常用到,并且他的预发规则与我们平台的有一点不一样,是流式的处理,非常类似RXJava的一个风格. ...

最新文章

  1. 【C++】拷贝,赋值与构造
  2. 事物 @Transactional
  3. [蓝桥杯2016决赛]愤怒小鸟-模拟
  4. Ubuntu下tftp服务器的搭建
  5. S2-MLPV2:目前最强的视觉MLP架构,空降榜一,达到83.6% Top-1准确率
  6. 数字权限管理(DRM)技术
  7. 读“游戏之旅——我的编程感悟”:难得的休闲读物
  8. 《精通javascript》5,6章小结(一)
  9. html5 命运之轮生产
  10. win8蓝屏错误代码DPC_WATCHDOG_VIOLATION您的电脑遇到错误需要重启修复
  11. 区块链技术之P2P网络(一)
  12. mysql的my.cnf常用配置
  13. 文献综述是什么,该怎么写?
  14. Excel分列小技巧
  15. 网络设备网卡、中继器、集线器、网桥、交换机、路由器工作原理
  16. dic={key:“字典”}
  17. python安装及使用技巧
  18. 清华计算机系科学博士毕业论文要求,博士可以不发SCI毕业?清华取消博士论文发表强制要求...
  19. 【微信公众号H5授权登录】
  20. C语言中的自定义函数

热门文章

  1. 学成在线首页——静态页面基础项目(HTML+CSS)【学习笔记】
  2. tomcat组播实现session一致性_java会话技术-Session
  3. DID会固定年份吗_倍分法DID详解 (二):多时点 DID (渐进DID)
  4. 低代码开发平台_如何挑选最适合你的低代码开发平台
  5. python cocos2dx_cocos2dx 3.0 环境搭建、项目编译于运行
  6. 如何在程序中画出实际大小为7CM半径的圆
  7. linux启动关闭脚本,Linux中启动/停止/重启/状态的startup脚本
  8. 只在用户登陆时运行_linux 系统的7个运行级别
  9. 机器学习、AI那么火,千万小心别掉进前人的坑
  10. 机器学习入门系列:关于机器学习算法你需要了解的东西、如何开发机器学习模型?...