Я пытался преобразовать свой поток в карту с помощью следующего кода:
Collectors.toMap(City::key, Function.identity(), (first, second) -> first)
Мой вопрос по поводу последней лямбды.
(first, second) -> first
Мне часто нужно получить элемент любой или всегда элемент первый, если происходит столкновение.
Я понимаю, что это уже краткая и понятная форма. Но все равно. Для класса Function у нас есть фабричный метод Function.identity(), который возвращает переданный параметр как есть. У нас заводской метод есть для BiFunction или для BinaryOperator? А может что-то близкое к Function.identity().
Я тоже знаю про BinaryOperator.minBy() и BinaryOperator.maxBy(), но они больше "подробный" и не такие понятные методы, чем Function.identity().
Я не знаю ни одного такого метода, но вы можете предоставить свой собственный. Почему бы тебе не попробовать?
Кроме того, если в стандартной библиотеке нет ничего подобного, не стоит ли было бы легко создать новую? Да ладно, это банально.
Насколько мне известно, в стандартной библиотеке Java такого метода нет. Это могло быть по нескольким причинам, в том числе 1, которые разработчики Java забыли, 2, которые они не могли логически решить, какой из них следует вернуть (первый или второй?), 3 они не согласны с вами относительно того, как «часто» это используется, и думали, что это будет иметь небольшую ценность.
Да, я думаю, что все ваши ответы верны, спасибо за ваши предложения. Искал что-то в стандартной библиотеке, но, судя по всему, ничего подобного здесь нет.




Вы можете легко объявить свои собственные методы:
public class BinaryOperators {
public static <T> BinaryOperator<T> first() {
return (first, second) -> first;
}
public static <T> BinaryOperator<T> second() {
return (first, second) -> second;
}
public static <T> BinaryOperator<T> any() {
return (first, second) -> ThreadLocalRandom.current().nextBoolean() ? first : second;
}
}
а затем используйте их в своем коде:
Collectors.toMap(City::key, Function.identity(), BinaryOperators.first())
со статическим импортом:
Collectors.toMap(City::key, identity(), first())
Или просто не заморачивайтесь с приведенным выше кодом и используйте (a, b) -> a:
toMap(City::key, identity(), (a, b) -> a))
Довольно ясно и кратко, ИМО
И конечно же: public static <T> BinaryOperator<T> surpriseMe() { return (a, b) -> ThreadLocalRandom.current().nextBoolean() ? a : b; }
@MCEmperor =) замечательно. Спасибо.
Ну, разве короткая специальная лямбда недостаточно хороша?