java: 带有 lambda 表达式的 Arrays.sort()

Posted

技术标签:

【中文标题】java: 带有 lambda 表达式的 Arrays.sort()【英文标题】:java: Arrays.sort() with lambda expression 【发布时间】:2014-03-25 02:37:55 【问题描述】:

我想使用Arrays.sort 方法按长度对数组months 中的字符串元素进行排序。我被告知here,可以使用 lambda 表达式而不是创建实现 Comparator 的新类。完全一样的方法,但它不起作用。

import java.util.Arrays;
import java.util.Comparator;

public class MainClass 
public static void main(String[] args)


    String[] months = "January","February","March","April","May","June","July","August","September","October","December";

    System.out.println(Arrays.toString(months)); //printing before


    //neither this works:
    Arrays.sort(months, 
            (a, b) -> Integer.signum(a.length() - b.length())   
    );

    //nor this:
    Arrays.sort(months, 
            (String a, String b) ->  return Integer.signum(a.length() - b.length()) ; 
    );


    System.out.println(Arrays.toString(months)); //printing after


【问题讨论】:

“完全一样的方法,但它不起作用。”不,你没有,仔细阅读他们做了什么。您有语法错误。 @ZouZou 也许他做到了。我认为 OP 甚至没有使用 Java 8。 【参考方案1】:

你正在寻找这个:

Arrays.sort(months, (a, b) -> Integer.signum(a.length() - b.length()));

【讨论】:

为我工作...您确定您使用的是 Java 8 吗?您使用的是哪个 IDE? @lavsprat 它也适用于我,它打印 [May, June, July, March, April, August, January, October, February, December, September]... 你使用的是什么 Java 8 版本? 我正在使用 Eclipse。 This 网站说我有第 7 版更新 51。 那么你当然不能使用 lambda,因为它们只在 Java 8 中可用。【参考方案2】:

最干净的方法是:

Arrays.sort(months, Comparator.comparingInt(String::length));

或者,使用静态导入:

Arrays.sort(months, comparingInt(String::length));

但是,这也可以,但更冗长:

Arrays.sort(months,
            (String a, String b) -> a.length() - b.length());

或更短:

Arrays.sort(months, (a, b) -> a.length() - b.length());

最后一个:

Arrays.sort(months, 
    (String a, String b) ->  return Integer.signum(a.length() - b.length()) ; 
);

; 放错了位置 - 应该是:

Arrays.sort(months, 
    (String a, String b) ->  return Integer.signum(a.length() - b.length()); 
);

【讨论】:

+1 用于显示 Comparator.comparing,这比编写自定义 lambda 或 Comparator 更容易掌握。 我建议使用Integer.compare 而不是- 的signum。 @PeterLawrey 确实 - signum(a-b) 有溢出的风险(即使字符串不太可能)。 @lavsprat 呵呵....版本 7 != 版本 8...Java 8 在这里:jdk8.java.net/download.html 我认为- 在这种情况下不会溢出,因为这两个值都是非负数。【参考方案3】:

您正在寻找的功能在尚未发布的 Java 8 中。如果您想等待,或者如果没有可用的测试版下载,它计划在几个月后发布。

【讨论】:

有用的评论,但不是答案。 @TedHopp 这是一个答案。他的代码没有编译,因为他试图在 Java 7 中使用 Java 8 功能! 他的代码没有编译,因为它有语法错误(Arrays.sort 的第二个参数末尾的分号)。 这条评论有点误导,除非你把三周算作“几个月”:发货日期是3月18日

以上是关于java: 带有 lambda 表达式的 Arrays.sort()的主要内容,如果未能解决你的问题,请参考以下文章

java8之lambda表达式入门

Java Lambda 表达式的官网教程理解

java8之lambda表达式-基本语法

公子奇带你一步一步了解Java8中Lambda表达式

不理解这个带有 defaultdict 的 lambda 表达式

将数组/字符串列表转换为数组/整数列表的 Lambda 表达式