How to sort a Comparator with dynamic parameters?

membersound :

Is it possible to create a static Comparator (so I don't have to recreate the object on each comparison), but still pass a dynamic value for compare?

In the following example, I want to pass a String dynaval parameter during compare. But how?

private final Comparator<Person> COMPARATOR = Comparator.comparing(person -> {
     if (person.getFirstname() != null) return person.getFirstname();
     return evaluateWithDynamicProperty(person, dynaval);
}

Collections.sort(persons, COMPARATOR); //TODO how to pass dynamic String?
Andy Turner :

Make a method:

private final Comparator<Person> personComparator(String dynaValue) {
  return Comparator.comparing(person -> {
     if (person.getFirstname() != null) return person.getFirstname();
     return evaluateWithDynamicProperty(person, dynaval);
}

Invoke like:

Collections.sort(persons, personComparator(dynaValue));

Or, use a lambda:

String personComparatorFn(Person person, String dynaValue) {
     if (person.getFirstname() != null) return person.getFirstname();
     return evaluateWithDynamicProperty(person, dynaval);
}

and invoke like:

Collections.sort(persons, Comparator.comparing(p -> personComparatorFn(p, dynaValue));

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=117239&siteId=1