【问题标题】:Please help me to understand the use of "->" in Arrays.sort() [duplicate]请帮助我理解 Arrays.sort() 中“->”的使用 [重复]
【发布时间】:2022-02-09 11:58:52
【问题描述】:

我在 geeksforgeeks 中解决问题时突然明白了这一点。我了解“Integer.compare”的使用,但无法在 sortBySetBitCount 方法中使用“->”。

static void sortBySetBitCount(Integer arr[], int n)
{ 
    Arrays.sort(arr, (a, b) -> Integer.compare(countSetBit(b), countSetBit(a)));
         //I mean here the "->" operator
} 

static int countSetBit(int n) {
    int count = 0;
    while (n>0) {
        n = n & (n - 1);
        count += 1;
    }
    return count;
}

【问题讨论】:

标签: java


【解决方案1】:

Java 8 中添加了 Lambda 表达式,并在下面提供 功能。

允许将功能视为方法参数,或将代码视为数据。

可以创建的函数不属于任何类。

一个 lambda 表达式可以像一个对象一样被传递并按需执行。

语法:

lambda operator -> body

lambda 运算符可以是:

零参数:

() -> System.out.println("Zero parameter lambda");

一个参数:--

(p) -> System.out.println("One parameter: " + p);

如果可以从上下文中推断出该变量的类型,则不必使用括号

多个参数:

(p1, p2) -> System.out.println("Multiple parameters: " + p1 + ", " +p2);

以上示例的来源GeeksForGeeks

import java.util.*;

class MainClass{
    public static void main(String ... $){
        var out = System.out;
        Integer arr[] = {10, 32, 31};
        sortBySetBitCount(arr);
        //output is 31, 10, 32
        //31 has 5 set bits
        //10 has 3 set bits
        //32 has 1 set bit
        out.println(Arrays.asList(arr));

    }
    static void sortBySetBitCount(Integer arr[]){ 
        //first argument is array they we want to sort
        //second argument is a lambda method
        Arrays.sort(arr, (a, b) -> Integer.compare(countSetBit(b), countSetBit(a)));
    } 
    //Returns numbers of bit set
    static int countSetBit(int n) {
        int count = 0;
        while (n != 0) {
            n = n & (n - 1);
            count += 1;
        }
        return count;
    }
}

输出:

$ javac MainClass.java && java MainClass 
[31, 10, 32]

关于 lambda 方法的更多信息:

Lambda method in java

【讨论】:

    【解决方案2】:

    这是 Java 8 中引入的新 lambda 表达式语法的一部分。有几个在线教程可以掌握它,Lambda 表达式文档 API link

    基本上是 符号 -> 将参数(即左侧)与实现(即右侧)分开

    使用 lambda 表达式的一般语法是

    (Parameters) -> { Body } 其中 -> 分隔参数和 lambda 表达式主体。

    参数用括号括起来,这与方法相同,lambda 表达式主体是用大括号括起来的代码块。

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 2020-01-20
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 2011-11-02
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多