我在代码中嵌入了我的问题;我试图通过编写一个需要通用Function
签名的方法来消除代码重复(我认为):
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
class Sortable {
private String name;
private int id;
private long data;
Sortable(String name, int id, long data) {
this.name = name;
this.id = id;
this.data = data;
}
public String name() { return name; }
public int id() { return id; }
public long data() { return data; }
@Override
public String toString() {
return String.format("%-7s %-5d %d", name, id, data);
}
}
public class SortByMethod {
// Here's the method I want to create, in order
// to eliminate repetition. But what signature to use?
/*
public void sortBy(String by, List<Sortable> list, Function<???, ???> keyExtractor) {
System.out.println("--- Sorted By " + by + " ---");
list.stream()
.sorted(Comparator.comparing(keyExtractor))
.forEach(System.out::println);
}
*/
public static void main(String[] args) {
List<Sortable> list = Arrays.asList(
new Sortable("Foo", 11, 991876),
new Sortable("Bar", 1, 991875),
new Sortable("Baz", 7, 991874),
new Sortable("Bingo", 19, 991873)
);
System.out.println("--- Sorted By Name ---");
list.stream()
.sorted(Comparator.comparing(Sortable::name))
.forEach(System.out::println);
System.out.println("--- Sorted By ID ---");
list.stream()
.sorted(Comparator.comparing(Sortable::id))
.forEach(System.out::println);
System.out.println("--- Sorted By Data ---");
list.stream()
.sorted(Comparator.comparing(Sortable::data))
.forEach(System.out::println);
// Instead of the above repetitive code, I'd like to say:
/*
sortBy("Name", list, Sortable::name);
sortBy("ID", list, Sortable::id);
sortBy("Data", list, Sortable::data);
*/
}
}
除了keyExtractor
的签名外,我已经解决了所有问题。
答案 0 :(得分:4)
您的方法应如下所示:
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);
}
实现这一目标的最快方法是简单地转到Comparator.comparing()
,然后复制粘贴其签名中的泛型,因为您必须完成其API约束:
static <T,U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T,? extends U> keyExtractor)