Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Java 8泛型compareBy()方法签名_Generics_Java 8 - Fatal编程技术网

Generics Java 8泛型compareBy()方法签名

Generics Java 8泛型compareBy()方法签名,generics,java-8,Generics,Java 8,我在代码中嵌入了我的问题;我试图通过编写一个需要通用函数签名的方法来消除代码重复(我认为): import java.util.*; 导入java.util.function.*; 导入java.util.stream.*; 类可排序{ 私有字符串名称; 私有int-id; 私有长数据; 可排序(字符串名称、整数id、长数据){ this.name=名称; this.id=id; 这个数据=数据; } 公共字符串名称(){return name;} public int id(){return

我在代码中嵌入了我的问题;我试图通过编写一个需要通用
函数
签名的方法来消除代码重复(我认为):

import java.util.*;
导入java.util.function.*;
导入java.util.stream.*;
类可排序{
私有字符串名称;
私有int-id;
私有长数据;
可排序(字符串名称、整数id、长数据){
this.name=名称;
this.id=id;
这个数据=数据;
}
公共字符串名称(){return name;}
public int id(){return id;}
公共长数据(){return data;}
@凌驾
公共字符串toString(){
返回字符串。格式(“%-7s%-5d%d”,名称、id、数据);
}
}
公共类排序方法{
//下面是我想要创建的方法
//消除重复。但是使用什么签名呢?
/*
public void排序方式(字符串依据、列表列表、函数键提取器){
System.out.println(“---按“+按+”排序);
list.stream()
.分类(比较器.比较(键提取器))
.forEach(System.out::println);
}
*/
公共静态void main(字符串[]args){
List=Arrays.asList(
新可排序(“Foo”,11991876),
新可排序(“Bar”,1991875),
新可分类(“Baz”,7991874),
新可排序(“宾果”,19991873)
);
System.out.println(“---按名称排序---”);
list.stream()
.sorted(Comparator.comparing(可排序::名称))
.forEach(System.out::println);
System.out.println(“--按ID排序---”);
list.stream()
.sorted(Comparator.comparing(Sortable::id))
.forEach(System.out::println);
System.out.println(“--按数据排序---”);
list.stream()
.sorted(Comparator.comparing(可排序::数据))
.forEach(System.out::println);
//与上面重复的代码不同,我想说:
/*
排序方式(“名称”、列表、可排序::名称);
排序方式(“ID”,列表,可排序::ID);
排序方式(“数据”、列表、可排序::数据);
*/
}
}

我已经解决了所有问题,除了
密钥提取程序的签名

您的方法应该如下所示:

static <T, U extends Comparable<? super U>> void sortBy(
    String column, 
    List<? extends T> list, 
    Function<? super T, ? extends U> keyExtractor) {

    System.out.println("--- Sorted By " + column + " ---");
    list.stream()
        .sorted(Comparator.comparing(keyExtractor))
        .forEach(System.out::println);
}

一旦我看到它完成了,它就有意义了。困难的部分是认识到如何着手解决它。@user1677663:是的,这种协变/逆变的东西很棘手。
static <T, U extends Comparable<? super U>> void sortBy(
    String column, 
    List<? extends T> list, 
    Function<? super T, ? extends U> keyExtractor) {

    System.out.println("--- Sorted By " + column + " ---");
    list.stream()
        .sorted(Comparator.comparing(keyExtractor))
        .forEach(System.out::println);
}
static <T,U extends Comparable<? super U>> Comparator<T> comparing(
    Function<? super T,? extends U> keyExtractor)