#java #list #arraylist #append #java-stream
Вопрос:
Я пытаюсь добавить два списка в соответствии с их размером. Со списком большего размера спереди.
У меня мало таких списков.
List<Pair<Double, String>> masterList = new ArrayList<>();
и это рабочий Java — код, который я попробовал первым- с простым if else
циклом:
if (listOne.size() >= listTwo.size()){
masterList.addAll(listOne);
masterList.addAll(listTwo);
} else {
masterList.addAll(listTwo);
masterList.addAll(listOne);
}
masterList.addAll(otherList); // and at the end all other list can be added without any condition
Я довольно новичок в Java, поэтому изучал ее и наткнулся на компараторы и Лямбду. Итак, я попытался использовать это для своего кода, что-то вроде этого:
List<Pair<Double, String>> masterList = Stream.concat(listOne.stream(), listTwo.stream())
.filter(Comparator.comparingInt(List::size))
.collect(Collectors.toList())
Но я не в состоянии добиться должных результатов.
Может кто-нибудь указать на мою ошибку, я все еще пытаюсь учиться.
Комментарии:
1. Использование потоков здесь кажется совершенно ненужным, есть ли какая-либо причина, по которой вы должны это делать?
2. В основном это было с точки зрения обучения. Кроме того, с
Stream
помощью прецедента можно расширить числоList
Ответ №1:
Цикл for очень хорош, Stream
в этом нет необходимости, но, чтобы ответить на вопрос, вы можете
- не используйте
concat
, так как он уже будет присоединяться к спискам, и вы потеряете концепцию другого списка - не используйте
filter
, а скорееsorted
- затем
flatMap
перейти отStream<List<Pair<>>>
кStream<Pair<>>
List<Pair<Double, String>> masterList = Stream.of(listOne, listTwo)
.sorted(Comparator.comparing(List::size, Comparator.reverseOrder()))
.flatMap(List::stream)
.collect(Collectors.toList());
masterList.addAll(otherList);
Комментарии:
1. @JoakimDanielson это только список, который ОП добавляет в конце
2. также как насчет того
.sorted(Comparator.comparing(List::size, Comparator.reverseOrder()))
, чтобы отсортировать их в обратном порядке, а затем выровнять — то же самое по-другому3. @PiyushAggarwal не помнил эту конструкцию, хотя
.sorted(Comparator.comparing(List::size).reversed())
и об ошибкеnon static method cannot be referenced
, и я не хотел навязывать конкретный тип lmabda
Ответ №2:
Его можно использовать Stream.concat
для объединения содержимого otherList
и, таким образом, для избавления от masterList.addAll
Кроме того, есть пример использования Comparator.reversed()
метода:
List<Pair<Double, String>> masterList = Stream.concat(
Stream.of(listOne, listTwo) // Stream<List<Pair>>
.sorted(Comparator.<List>comparingInt(List::size).reversed())
.flatMap(List::stream), // Stream<Pair>
otherList.stream() // Stream<Pair>
)
.collect(Collectors.toList());
Однако тернарный оператор также должен хорошо работать, чтобы определить более длинный список для размещения в начале:
List<Pair<Double, String>> masterList2 = Stream.concat(
(listOne.size() >= listTwo.size()
? Stream.of(listOne, listTwo)
: Stream.of(listTwo, listOne)
)
.flatMap(List::stream),
otherList.stream()
)
.collect(Collectors.toList());