资讯动态

java 4种类型的方法引用

发布时间:2026/10/24 4:11:28 来源:尧图企业网站定制
文章目录Long::valueOf 叫做【方法引用】是 Java8 的语法糖拆开看三种等价写法放一起对比再搞懂 valueOf 本身4种类型的方法引用很常用1. **类::静态方法** → Long::valueOf咱们这个就是2. **对象::实例方法**3. **类名::实例方法**4. **构造方法引用**关键规则套回你整条代码理解小坑提醒四种方法引用汇总表例子例1 - 正确写法例2 - 错误的写法提炼公式Long::valueOf叫做【方法引用】是 Java8 的语法糖SetStringtop5newLinkedHashSet();top5.add(10086);top5.add(10001);top5.add(10050);ListLongidstop5.stream().map(Long::valueOf).collect(Collectors.toList());先一句话Long::valueOf等价于str - Long.valueOf(str)只是简写。拆开看.map(Long::valueOf).map()里面需要传一个函数输入一个字符串返回一个Long。完整lambda写法.map(str-Long.valueOf(str))输入流里每一个元素String 类型比如10086执行调用Long.valueOf(10086)返回10086L当 lambda 里面只是把参数原样传给一个静态方法就可以简写为类名::静态方法→ 也就是Long::valueOf格式类名::静态方法名三种等价写法放一起对比1. 最原始lambda.map(str-Long.valueOf(str))2. 方法引用咱们代码里用的简洁.map(Long::valueOf)3. 最土的匿名内部类几乎没人写了解就行.map(newFunctionString,Long(){OverridepublicLongapply(Stringstr){returnLong.valueOf(str);}})再搞懂 valueOf 本身Long.valueOf(10086);这是 Long 的静态方法接收字符串把数字字符串转成Long包装对象。区分一下Long.parseLong(10086)返回的是基础类型longLong.valueOf(10086)返回包装类Long✅ 正好适合放进ListLong4种类型的方法引用很常用1.类::静态方法→Long::valueOf咱们这个就是2.对象::实例方法UserusernewUser();stream.forEach(user::sayHello);总结对象::方法名如果方法无参流元素只是用来触发方法不拿这个值user::sayHello// sayHello() 无参如果方法1个参数流里传过来的元素自动传给这个方法当入参nameMap::get// map.get(key) 一个入参user::sayHello// sayHello(name) 一个入参不能是2个及以上参数这种简写方式用不了。3.类名::实例方法stream.map(User::getName);.map(User::getName)就是user - user.getName()流元素本身就是要调用方法的实例方法无参User::getName说白了就是 流里本身就是对象调用它自己身上的无参方法【例子】 userStream.map(User::getId)等价user - user.getId()流里面的元素是User对象直接调用这个User自己的 getId()。4.构造方法引用stream.map(UserDTO::new);// new UserDTO(...)UserDTO::new 等价于 obj-newUserDTO(obj)专门用来调用构造器 new 对象【例子】classUserDTO{privateLongid;privateStringname;// 构造方法入参是UserpublicUserDTO(Useruser){this.iduser.getId();this.nameuser.getName();}}.map(UserDTO::new)等价完整 lambda.map(user-newUserDTO(user)) 管道流动过程流里元素user1、user2、user3user1 →new UserDTO(user1)→ dto1user2 →new UserDTO(user2)→ dto2user3 →new UserDTO(user3)→ dto3关键规则类名::new流里面传过来的元素当作构造方法的入参。流里1个元素 → 对应构造器1个形参流里传User构造器就要有User入参流里传String构造器就要有String入参比如String作为参数classHello{publicHello(Stringmsg){}}ListStringlistArrays.asList(a,b);list.stream().map(Hello::new);等价 s - new Hello(s)注意构造器重载的时候编译器会根据流中元素类型自动匹配对应参数的构造方法。套回你整条代码理解ListLongidstop5.stream().map(Long::valueOf)每个字符串id调用 Long.valueOf 转 Long.collect(Collectors.toList());元素依次流过10086→Long.valueOf(10086)→10086L小坑提醒如果字符串不是数字比如abc不管是str-Long.valueOf(str)还是简写Long::valueOf都会抛NumberFormatException。咱们业务里Redis存的都是用户id数字串所以安全。四种方法引用汇总表写法类型等价lambda场景Long::valueOf类::静态方法s - Long.valueOf(s)调用静态方法流元素作为入参userMap::get对象::实例方法k - userMap.get(k)已有对象流元素传给它的方法当参数User::getId类::实例方法u - u.getId()流里面就是实例对象调用它自身无参方法UserDTO::new构造方法引用u - new UserDTO(u)拿流里元素创建新对象例子例1 - 正确写法key是字符串value是名字MapString,StringnameMapnewHashMap();nameMap.put(a01,张三);nameMap.put(a02,李四);流里面元素是字符串和get入参匹配ListStringcodeListArrays.asList(a01,a02);ListStringnamescodeList.stream().map(nameMap::get).filter(Objects::nonNull).collect(Collectors.toList());这里的.map(nameMap::get)等价lambda.map(code - nameMap.get(code))咱们一步步走这个流流第一个元素a01→nameMap.get(a01)→张三流第二个元素a02→nameMap.get(a02)→李四经过.map(nameMap::get)之后管道里面的数据就变成张三 , 李四然后后面.filter(Objects::nonNull)过滤null防止code不存在查不到最后收集成List。总之【.map(xxxMap::get)是从已经存在的 map 里根据 key 取值】例2 - 错误的写法MapLong,UseruserMap...;流里面是 Stringmap的key是LongListStringstrListArrays.asList(10086,10001);strList.stream().map(userMap::get)❌报错get要Long流给的是String类型不匹配这个时候就不能直接userMap::get得先转换strList.stream().map(Long::valueOf)// 先转Long.map(userMap::get)// ✅ 现在类型匹配了...提炼公式.stream().map(某个对象::单参方法)公式流中元素 → 作为这个单参方法的唯一入参→ 返回方法结果只要类型匹配、方法只需要一个参数就可以这么写。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑