Java 8 Generic compareBy()方法签名

时间:2016-03-23 20:09:04

标签: generics java-8

我在代码中嵌入了我的问题;我试图通过编写一个需要通用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的签名外,我已经解决了所有问题。

1 个答案:

答案 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)