Вы можете получить второе минимальное значение следующим образом:
set.stream()
.filter(s -> s.getValue() != minObject.getValue())
.min(Comparator.comparingInt(object -> object.getValue()))
.get();
- Это снова распространяется на набор элементов, гарантируя, что мы игнорируем предыдущее минимальное значение с помощью
filter
. - Затем мы получаем минимальное значение через
min
, или вы можете получить оба одновременно:
Stream<SomeObject> twoMinValues = set.stream()
.sorted(Comparator.comparingInt(object -> object.getValue()))
.limit(2);
- Это потоки по наборуэлементов, сортируя всю последовательность от наименьшего к наибольшему, а затем выбирая первые два, что определенно менее эффективно, чем описанный выше подход из-за поведения «отсортированной» промежуточной операции.
Awnser должен быть быстрым, потому что в моей настоящей программе я вызываю этот метод много раз, и мои наборы очень большие.
Что касается необходимости «быстрой» программы, я бы порекомендовал вам сначала попробоватьрешить проблему под рукой, просто используя типичный императивный подход, поскольку в большинстве случаев они быстрее, чем при использовании потоков.
если не намного лучше, тогда «подумайте» об использовании параллельных потоков, если и только если вы знаете, что можете использовать параллелизм.
см. Должен ли я всегда использовать параллельный поток, когда это возможно?