CTimet 2021-11-26 19:21 采纳率: 84%
浏览 20
已结题

Help!有人能为我解读这段代码的意思和工作过程以及原理吗

问题遇到的现象和发生背景 :

在《Java核心技术 卷I》中有这样一段代码

问题相关代码:
var planets = new String[] {"Mei","Ve","Earth"};
System.out.println(Arrays.toString(planets));
Arrays.sort(planets);
System.out.println(Arrays.toString(planets));
System.out.println("Length:");
Arrays.sort(planets,(first,second) -> first.length() - second.length());
System.out.println(Arrays.toString(planets));

在里面有这样一段Lambda表达式:
(first,second) -> first.length() - second.length()
以及它所在的语句:
Arrays.sort(planets,(first,second) -> first.length() - second.length());
这里我不理解的是,为什么我在Java的API网站上没有寻找到sort方法的格式是(参数1,参数2)的

Java API的sort方法:

img


img

编辑器(IDEA)的运行结果:

img

我想要知道的

1.为什么Java API网站上没有关于sort方法的双参数方法?API上的sort方法都只有1个参数或3个参数。而在源代码中存在2个参数。分别是数组planets和Lambda表达式。那么,是不是我理解错了,或许Lambda表达式根本不是一个参数?如果不是,那它在这里的作用是什么?怎么运行的?
2.为什么要向sort方法传入一个Lambda表达式?这里这个Lambda表达式起到了什么作用?为什么最后传入Lambda表达式后排序后的数组由[Earth, Mei, Ve]变成了[Ve, Mei, Earth]?这里的原理是什么?它是如何工作的?

我希望各位回答者:

1.尽量回答全,保证答案中含有上面2个问题的答案
2.能够以通俗的语言(好理解)解释Lambda表达式是如何工作的。尽力做到这一点

在此,致谢!
  • 写回答

1条回答 默认 最新

  • 机智的爆爆哥 2021-11-27 18:24
    关注

    用的其实就是两个参数的方法
    public static <T> void sort(T[] a, Comparator<? super T> c)

    public class Demo2 {
        public static void main(String[] args) {
            User user1 = new User(1,"A");
            User user2 = new User(2,"B");
            User user3 = new User(3, "C");
            User[] users = new User[3];
            users[0] = user1;
            users[1] = user2;
            users[2] = user3;
            //里面用了Comparator 传入的是lambda表达式 这里 根据id排序 当结果<0 升序 否则降序
            Arrays.sort(users, (u1, u2) -> u2.getId() - u1.getId());
            //打印
            Arrays.stream(users).forEach(System.out::println);
            //结果
    //        User(id=3, name=C)
    //        User(id=2, name=B)
    //        User(id=1, name=A)
        }
    
    }
    
    @Data
    @AllArgsConstructor
    class User {
        private Integer id;
        private String name;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月6日
  • 已采纳回答 11月28日
  • 创建了问题 11月26日

悬赏问题

  • ¥66 换电脑后应用程序报错
  • ¥50 array数据同步问题
  • ¥15 pic16F877a单片机的外部触发中断程序仿真失效
  • ¥15 Matlab插值拟合差分微分规划图论
  • ¥15 keil5 target not created
  • ¥15 C/C++数据与算法请教
  • ¥15 怎么找志同道合的伙伴
  • ¥20 如何让程序ab.eXe自已删除干净硬盘里的本文件自己的ab.eXe文件
  • ¥50 爬虫预算充足,跪巨佬
  • ¥15 滑块验证码拖动问题悬赏