【问题标题】:Java8 lambda expression for sorting用于排序的 Java8 lambda 表达式
【发布时间】:2018-09-27 10:41:07
【问题描述】:

为了对集合进行排序,可以使用以下方法:

import java.util.ArrayList;
import java.util.Collections;

public class LambdaSort {

    public static void main(String args[]) {
        ArrayList arr = new ArrayList();
        Collections.sort(arr);
    }
}

在这种情况下,排序是多余的,因为集合是空的。 为了使用通用排序函数而不是Collections.sort,我创建了一个以排序函数为参数的新方法:

private void genericSort(() -> java.util.List)) {

}

但这不会进行类型检查并导致错误:

Multiple markers at this line
    - Syntax error, insert "[ ]" to complete Dimension
    - Syntax error on token(s), misplaced construct(s)
    - Syntax error on token "void", @ expected after this token
    - Syntax error, insert "Identifier (" to complete 
     MethodHeaderName
    - Method breakpoint:LambdaSort [entry] - genericSort()

我打算将函数用作:

LambdaSort ls new LambdaSort()
ls.genericSort(Collections.sort(ls))

我应该如何定义我的genericSort 以接受通用排序函数?

【问题讨论】:

  • 看起来你正在尝试发明新的 Java 语法,受到 Haskell 的启发。提示:对 Java lambda 和方法引用做一些研究,然后查看 Consumer 接口。你的代码有太多问题了。
  • Collections.sort(list) 返回无效。不能作为参数传递

标签: java java-8


【解决方案1】:

你为什么需要genericSort方法?

如果需要自定义排序算法,可以使用

java.util.Collections#sort(java.util.List<T>, java.util.Comparator<? super T>)

看起来这是您需要的。它接受列表本身作为第一个参数,排序策略作为第二个参数。

关于您的代码,lamdba 声明不能是方法参数声明。您可以在调用方法时将其作为参数传递。

此外,() -&gt; java.util.List) 不是有效的 lambda 声明。它有额外的括号 )java.util.List 它不是有效的 return 语句。

【讨论】:

【解决方案2】:

要按照您最初的意图做某事,您可以使用:

private static void genericSort(Consumer<List<Integer>> f, List<Integer> l) {
    ...
    f.accept(l);
    ...
}

这样称呼它

genericSort(Collections::sort, new ArrayList<Integer>());

【讨论】:

  • 我懒得写这个内容了。但我很感谢你花时间写它:-)
【解决方案3】:

好的,首先:在 Java 8 中类似于

List<String> names = new ArrayList<>();
names.add("Jim");
names.add("Bob");

List<String> sortedNames = names.stream()
 .sorted(Comparators.natural())
 .collect(Collectors.toList());

可以使用https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html


除此之外,回答您的一般问题:

private void<T>(Comparator<T> comparator, List<T> list) {
 //do something
}

有可能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多