Если у меня есть:
List<Integer> listInts = { 1, 1, 3, 77, 2, 19, 77, 123, 14, 123... }
в Java, что является эффективным способом создания List<Integer> listDistinctInts
, содержащего только отдельные значения из listInts
?
Мое непосредственное размышление - создать Set<Integer> setInts
, содержащий все значения из listInts
, затем вызвать List<Integer> listDistinctInts = new ArrayList<>(setInts);
Но это кажется потенциально неэффективным - есть ли лучшее решение, использующее Java 7?
Я не использую Java 8, но я считаю, что, используя его, я мог бы сделать что-то вроде этого (?):
List<Integer> listDistinctInts = listInts.stream().distinct().collect(Collectors.toList());
Будет ли это более реалистичным, чем подход выше и/или есть ли более эффективный способ сделать это в Java 8?
Наконец, (и я знаю, что задание нескольких вопросов может быть неодобрительно, но напрямую связано), если я только заботился о подсчете различных элементов в listInts
, есть ли более эффективный способ получить это значение (в Java 7 и 8) - без предварительного создания списка или набора всех отдельных элементов?
Мне больше всего интересны собственные способы Java для этого и избегание повторного создания каких-либо колес, но рассмотрим ручной код или библиотеки, если они предлагают лучшую четкость или производительность. Я прочитал этот связанный с нами вопрос Java - Distinct List of Objects, но не совсем ясно о различиях в производительности между подходами Java 7 и 8 или может быть лучше методы?