Мне интересно отсортировать список из потока. Это код, который я использую:
list.stream()
.sorted((o1, o2)->o1.getItem().getValue().compareTo(o2.getItem().getValue()))
.collect(Collectors.toList());
Я что-то упускаю? Список не сортируется.
Он должен отсортировать списки по элементу с наименьшим значением.
for (int i = 0; i < list.size(); i++)
{
System.out.println("list " + (i+1));
print(list, i);
}
И способ печати:
public static void print(List<List> list, int i)
{
System.out.println(list.get(i).getItem().getValue());
}
java
list
sorting
java-stream
Иван С
источник
источник
list.sort(Comparator.comparing(o -> o.getItem().getValue()));
был для меня в новинку. Большой!Java 8 предоставляет различные служебные методы api, которые помогают нам лучше сортировать потоки.
Если ваш список представляет собой список целых чисел (или Double, Long, String и т. Д.), Вы можете просто отсортировать список с помощью компараторов по умолчанию, предоставляемых java.
List<Integer> integerList = Arrays.asList(1, 4, 3, 4, 5);
Создание компаратора на лету:
С компаратором по умолчанию, предоставляемым java 8, когда в sorted () не передан аргумент:
integerList.stream().sorted().forEach(System.out::println); //Natural order
Если вы хотите отсортировать тот же список в обратном порядке:
integerList.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println); // Reverse Order
Если ваш список представляет собой список определенных пользователем объектов, тогда:
List<Person> personList = Arrays.asList(new Person(1000, "First", 25, 30000), new Person(2000, "Second", 30, 45000), new Person(3000, "Third", 35, 25000));
Создание компаратора на лету:
Использование метода Comparator.comparingLong () (у нас есть методы comparingDouble (), comparingInt () тоже):
Использование метода Comparator.comparing () (общий метод, который сравнивает на основе предоставленного метода получения):
Мы также можем выполнить цепочку, используя метод thenComparing ():
personList.stream().sorted(Comparator.comparing(Person::getPersonId).thenComparing(Person::getAge)).forEach(person -> System.out.println(person.getName())); //Sorting by person id and then by age.
Класс человека
public class Person { private long personId; private String name; private int age; private double salary; public long getPersonId() { return personId; } public void setPersonId(long personId) { this.personId = personId; } public Person(long personId, String name, int age, double salary) { this.personId = personId; this.name = name; this.age = age; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }
источник
Comparator.comparing*
- лучший и более ориентированный на JDK8 подходВроде нормально работает:
List<BigDecimal> list = Arrays.asList(new BigDecimal("24.455"), new BigDecimal("23.455"), new BigDecimal("28.455"), new BigDecimal("20.455")); System.out.println("Unsorted list: " + list); final List<BigDecimal> sortedList = list.stream().sorted((o1, o2) -> o1.compareTo(o2)).collect(Collectors.toList()); System.out.println("Sorted list: " + sortedList);
Пример ввода / вывода
Unsorted list: [24.455, 23.455, 28.455, 20.455] Sorted list: [20.455, 23.455, 24.455, 28.455]
Вы уверены, что не проверяете список вместо
sortedList
[в примере выше], то есть сохраняете результатstream()
в новомList
объекте и проверяете этот объект?источник
Collection<Map<Item, Integer>> itemCollection = basket.values(); Iterator<Map<Item, Integer>> itemIterator = itemCollection.stream().sorted(new TestComparator()).collect(Collectors.toList()).iterator(); package com.ie.util; import com.ie.item.Item; import java.util.Comparator; import java.util.Iterator; import java.util.Map; import java.util.Set; public class TestComparator implements Comparator<Map<Item, Integer>> { // comparator is used to sort the Items based on the price @Override public int compare(Map<Item, Integer> o1, Map<Item, Integer> o2) { // System.out.println("*** compare method will be called *****"); Item item1 = null; Item item2 = null; Set<Item> itemSet1 = o1.keySet(); Iterator<Item> itemIterator1 = itemSet1.iterator(); if(itemIterator1.hasNext()){ item1 = itemIterator1.next(); } Set<Item> itemSet2 = o2.keySet(); Iterator<Item> itemIterator2 = itemSet2.iterator(); if(itemIterator2.hasNext()){ item2 = itemIterator2.next(); } return -item1.getPrice().compareTo(item2.getPrice()); } }
**** это полезно для сортировки вложенных объектов карты, таких как Карта> здесь я отсортировал на основе цены объекта Item.
источник
Это простой пример:
List<String> citiesName = Arrays.asList( "Delhi","Mumbai","Chennai","Banglore","Kolkata"); System.out.println("Cities : "+citiesName); List<String> sortedByName = citiesName.stream() .sorted((s1,s2)->s2.compareTo(s1)) .collect(Collectors.toList()); System.out.println("Sorted by Name : "+ sortedByName);
Возможно, ваша IDE не получает jdk 1.8 или более позднюю версию для компиляции кода.
Установите версию Java 1.8 для Your_Project > properties> Project Facets> Java version 1.8
источник